当前位置:网站首页>【C# .NET 工具类 】一、Excel 读取与写入

【C# .NET 工具类 】一、Excel 读取与写入

2021-06-23 23:07:18 黑喵警员

Excel读取与写入需要依赖第三方类库,这里选择使用比较多、同时不依赖安装Office组件的NPOI。

支持xls和xlsx格式,区分方法详见代码。

在Nuget上找到并安装到项目中:

 

 

 

 

1.Excel读取数据:

  1   public partial class ExcelFile
  2     {
  3         /// <summary>
  4         /// 读取Excel文件
  5         /// </summary>
  6         /// <param name="filePath">被读取文件的路径</param>
  7         /// <param name="hasTitle">文件是否包含列头</param>
  8         /// <returns></returns>
  9         public static DataSet Read(string filePath,bool hasTitle = false)
 10         {
 11             IWorkbook wk = null;
 12             string extension = Path.GetExtension(filePath);
 13             try
 14             {
 15                 FileStream fs = File.OpenRead(filePath);
 16                 if (extension.Equals(".xls"))
 17                 {
 18                     //把xls文件中的数据写入wk中
 19                     wk = new HSSFWorkbook(fs);
 20                 }
 21                 else
 22                 {
 23                     //把xlsx文件中的数据写入wk中
 24                     wk = new XSSFWorkbook(fs);
 25                 }
 26 
 27                 fs.Close();
 28 
 29                 DataSet ds = new DataSet();
 30                 for (int tableindex = 0; tableindex < wk.NumberOfSheets; tableindex++)
 31                 {
 32                     //读取当前表数据
 33                     ISheet sheet = wk.GetSheetAt(tableindex);
 34 
 35                     IRow row = sheet.GetRow(0);  //读取当前行数据
 36                                                  //LastRowNum 是当前表的总行数-1(注意)
 37 
 38                     DataTable dt = new DataTable();
 39                     dt.TableName = sheet.SheetName;
 40 
 41                     for (int i = 0; i <= sheet.LastRowNum; i++)
 42                     {
 43                         row = sheet.GetRow(i);  //读取当前行数据
 44                         if (row != null)
 45                         {
 46                             if (hasTitle && i ==0)
 47                             {
 48                                 //LastCellNum 是当前行的总列数
 49                                 for (int j = 0; j < row.LastCellNum; j++)
 50                                 {
 51                                     //读取该行的第j列数据
 52                                     string value = row.GetCell(j).ToString();
 53                                     DataColumn dataColumn = new DataColumn();
 54                                     dataColumn.ColumnName = value;
 55                                     dataColumn.DataType = typeof(string);
 56                                     dt.Columns.Add(dataColumn);
 57                                 }
 58                                 continue;
 59                             }
 60 
 61                             
 62                             if (dt.Columns.Count == 0 || dt.Columns.Count != row.LastCellNum)
 63                             {
 64                                 for (int j = 0; j < row.LastCellNum; j++)
 65                                 {
 66                                     DataColumn dataColumn = new DataColumn();
 67                                     dataColumn.ColumnName = "Column" + j;
 68                                     dataColumn.DataType = typeof(string);
 69                                     dt.Columns.Add(dataColumn);
 70                                 }
 71                             }
 72 
 73                             DataRow dataRow = dt.NewRow();
 74 
 75                             //LastCellNum 是当前行的总列数
 76                             for (int j = 0; j < row.LastCellNum; j++)
 77                             {
 78                                 //读取该行的第j列数据
 79                                 string value = row.GetCell(j).ToString();
 80                                 dataRow[j] = value;
 81                             }
 82 
 83                             dt.Rows.Add(dataRow);
 84                         }
 85                     }
 86                     ds.Tables.Add(dt);
 87                 }
 88 
 89                 if (ds.Tables.Count == 0)
 90                 {
 91                     return null;
 92                 }
 93                 else
 94                 {
 95                     return ds;
 96                 }
 97             }
 98             catch (Exception e)
 99             {
100                 throw e;
101             }
102         }
103     }

 

2.Excel写入数据

  1 public partial class ExcelFile
  2     {
  3         /// <summary>
  4         /// 读取Excel文件
  5         /// </summary>
  6         /// <param name="filePath">被读取文件的路径</param>
  7         /// <returns></returns>
  8         public static bool Write(DataTable dt,string filePath)
  9         {
 10             try
 11             {
 12                 //创建一个工作薄  
 13                 IWorkbook workbook = new HSSFWorkbook();
 14 
 15                 //获取文件后缀
 16                 string extension = Path.GetExtension(filePath);
 17 
 18                 //根据指定的文件格式创建对应的类
 19                 if (extension.Equals(".xls"))
 20                 {
 21                     workbook = new HSSFWorkbook();
 22                 }
 23                 else
 24                 {
 25                     workbook = new XSSFWorkbook();
 26                 }
 27 
 28                 //创建一个 sheet 表
 29                 ISheet sheet = workbook.CreateSheet();
 30 
 31                 //创建一行
 32                 IRow rowH = sheet.CreateRow(0);
 33 
 34                 //创建一个单元格
 35                 ICell cell = null;
 36 
 37                 //创建单元格样式
 38                 ICellStyle cellStyle = workbook.CreateCellStyle();
 39 
 40                 //创建格式
 41                 IDataFormat dataFormat = workbook.CreateDataFormat();
 42 
 43                 //设置为文本格式,也可以为text,即dataFormat.GetFormat("text")
 44                 cellStyle.DataFormat = dataFormat.GetFormat("0");
 45 
 46                 //设置列名
 47                 foreach (DataColumn col in dt.Columns)
 48                 {
 49                     //创建单元格并设置单元格内容
 50                     rowH.CreateCell(col.Ordinal).SetCellValue(col.Caption);
 51 
 52                     //设置单元格格式
 53                     rowH.Cells[col.Ordinal].CellStyle = cellStyle;
 54                 }
 55 
 56                 //写入数据
 57                 for (int i = 0; i < dt.Rows.Count; i++)
 58                 {
 59                     //跳过第一行,第一行为列名
 60                     IRow row = sheet.CreateRow(i + 1);
 61                     for (int j = 0; j < dt.Columns.Count; j++)
 62                     {
 63                         cell = row.CreateCell(j);
 64                         cell.SetCellValue(dt.Rows[i][j].ToString());
 65                         cell.CellStyle = cell.CellStyle;
 66                     }
 67                 }
 68 
 69                 //设置新建文件路径及名称
 70                 if (File.Exists(filePath))
 71                 {
 72                     File.Delete(filePath);
 73                 }
 74 
 75                 //创建文件
 76                 //FileStream file = new FileStream(filePath, FileMode.CreateNew, FileAccess.Write);
 77 
 78                 FileStream fs = File.OpenWrite(filePath);
 79                 workbook.Write(fs);//向打开的这个Excel文件中写入表单并保存。  
 80                 fs.Close();
 81 
 82                 return true;
 83             }
 84             catch (Exception ex)
 85             {
 86                 throw ex;
 87             }
 88 
 89 
 90             #region 老方法
 91 
 92             ////创建工作薄  
 93             //IWorkbook wb = new HSSFWorkbook();
 94             //string extension = Path.GetExtension(filePath);
 95             ////根据指定的文件格式创建对应的类
 96             //if (extension.Equals(".xls"))
 97             //{
 98             //    wb = new HSSFWorkbook();
 99             //}
100             //else
101             //{
102             //    wb = new XSSFWorkbook();
103             //}
104 
105             //ICellStyle style1 = wb.CreateCellStyle();//样式
106             //style1.Alignment = HorizontalAlignment.Left;//文字水平对齐方式
107             //style1.VerticalAlignment = VerticalAlignment.Center;//文字垂直对齐方式
108             //                                                    //设置边框
109             //style1.BorderBottom = BorderStyle.Thin;
110             //style1.BorderLeft = BorderStyle.Thin;
111             //style1.BorderRight = BorderStyle.Thin;
112             //style1.BorderTop = BorderStyle.Thin;
113             //style1.WrapText = true;//自动换行
114 
115             //ICellStyle style2 = wb.CreateCellStyle();//样式
116             //IFont font1 = wb.CreateFont();//字体
117             //font1.FontName = "楷体";
118             //font1.Color = HSSFColor.Red.Index;//字体颜色
119             //font1.Boldweight = (short)FontBoldWeight.Normal;//字体加粗样式
120             //style2.SetFont(font1);//样式里的字体设置具体的字体样式
121             //                      //设置背景色
122             //style2.FillForegroundColor = HSSFColor.Yellow.Index;
123             //style2.FillPattern = FillPattern.SolidForeground;
124             //style2.FillBackgroundColor = HSSFColor.Yellow.Index;
125             //style2.Alignment = HorizontalAlignment.Left;//文字水平对齐方式
126             //style2.VerticalAlignment = VerticalAlignment.Center;//文字垂直对齐方式
127 
128             //ICellStyle dateStyle = wb.CreateCellStyle();//样式
129             //dateStyle.Alignment = HorizontalAlignment.Left;//文字水平对齐方式
130             //dateStyle.VerticalAlignment = VerticalAlignment.Center;//文字垂直对齐方式
131             //                                                       //设置数据显示格式
132             //IDataFormat dataFormatCustom = wb.CreateDataFormat();
133             //dateStyle.DataFormat = dataFormatCustom.GetFormat("yyyy-MM-dd HH:mm:ss");
134 
135             ////创建一个表单
136             //ISheet sheet = wb.CreateSheet("Sheet0");
137             ////设置列宽
138             //int[] columnWidth = { 10, 10, 20, 10 };
139             //for (int i = 0; i < columnWidth.Length; i++)
140             //{
141             //    //设置列宽度,256*字符数,因为单位是1/256个字符
142             //    sheet.SetColumnWidth(i, 256 * columnWidth[i]);
143             //}
144 
145             ////测试数据
146             //int rowCount = 3, columnCount = 4;
147             //object[,] data = {
148             //    {"列0", "列1", "列2", "列3"},
149             //    {"", 400, 5.2, 6.01},
150             //    {"", true, "2014-07-02", DateTime.Now}
151             //    //日期可以直接传字符串,NPOI会自动识别
152             //    //如果是DateTime类型,则要设置CellStyle.DataFormat,否则会显示为数字
153             //};
154 
155             //IRow row;
156             //ICell cell;
157 
158             //for (int i = 0; i < rowCount; i++)
159             //{
160             //    row = sheet.CreateRow(i);//创建第i行
161             //    for (int j = 0; j < columnCount; j++)
162             //    {
163             //        cell = row.CreateCell(j);//创建第j列
164             //        cell.CellStyle = j % 2 == 0 ? style1 : style2;
165             //        //根据数据类型设置不同类型的cell
166             //        object obj = data[i, j];
167             //        SetCellValue(cell, data[i, j]);
168             //        //如果是日期,则设置日期显示的格式
169             //        if (obj.GetType() == typeof(DateTime))
170             //        {
171             //            cell.CellStyle = dateStyle;
172             //        }
173             //        //如果要根据内容自动调整列宽,需要先setCellValue再调用
174             //        //sheet.AutoSizeColumn(j);
175             //    }
176             //}
177 
178             ////合并单元格,如果要合并的单元格中都有数据,只会保留左上角的
179             ////CellRangeAddress(0, 2, 0, 0),合并0-2行,0-0列的单元格
180             //CellRangeAddress region = new CellRangeAddress(0, 2, 0, 0);
181             //sheet.AddMergedRegion(region);
182 
183             //try
184             //{
185             //    FileStream fs = File.OpenWrite(filePath);
186             //    wb.Write(fs);//向打开的这个Excel文件中写入表单并保存。  
187             //    fs.Close();
188             //}
189             //catch (Exception e)
190             //{
191             //    Debug.WriteLine(e.Message);
192             //}
193 
194             #endregion
195         }
196     }

 

版权声明
本文为[黑喵警员]所创,转载请带上原文链接,感谢
https://www.cnblogs.com/xuehaox/p/14924844.html

随机推荐