C# .NET 工具类 一Excel 读取与写入
Posted 黑喵警员
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# .NET 工具类 一Excel 读取与写入相关的知识,希望对你有一定的参考价值。
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 }
以上是关于C# .NET 工具类 一Excel 读取与写入的主要内容,如果未能解决你的问题,请参考以下文章
1. Java POI 读取写入Excel(包括样式)的工具类Utils
在 C#、Java 和 PHP 中读取 Excel 文件和评估公式时,我都有哪些选择?