这两天在做一个故障报修系统,其中需要用到表格来统计记录信息,第一反应是弄个MySQL,安全可靠,别人改不了。然而…电脑比较老,带不动,又想用sqlite这种轻量级的数据库,又由于各种原因,放弃了sqlite,最终选择了Excel,因为它简单,快捷,就是不够安全。
操作Excel的方法很多,微软也提供了office组件,C#可以调用。如果对方电脑没装ofice那就尴尬了,用不了。不过代码狗今天讲的方法是不需要ofice组件支持的。
本文所需支持库在文章末尾有分享,看到最后哟!
先看看功能效果:
首先下载文章末尾的支持库,添加引用到你的工程中,并使用using字段进行引用。
下面是读取Excel文件的C#代码:
复制
public static DataTable getexcel(String fileName) { DataTable dt = new DataTable(); IWorkbook workbook = null; //新建IWorkbook对象 FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read); if (fileName.IndexOf(".xlsx") > 0) // 2007版本 { workbook = new XSSFWorkbook(fileStream); //xlsx数据读入workbook } else if (fileName.IndexOf(".xls") > 0) // 2003版本 { workbook = new HSSFWorkbook(fileStream); //xls数据读入workbook } ISheet sheet = workbook.GetSheetAt(0); //获取第一个工作表 IRow row;// = sheet.GetRow(0); //新建当前工作表行数据 // MessageBox.Show(sheet.LastRowNum.ToString()); row = sheet.GetRow(0); //row读入头部 if (row != null) { for (int m = 0; m < row.LastCellNum; m++) //表头 { string cellValue = row.GetCell(m).ToString(); //获取i行j列数据 Console.WriteLine(cellValue); dt.Columns.Add(cellValue); } } for (int i = 1; i <= sheet.LastRowNum; i++) //对工作表每一行 { System.Data.DataRow dr = dt.NewRow(); row = sheet.GetRow(i); //row读入第i行数据 if (row != null) { for (int j = 0; j < row.LastCellNum; j++) //对工作表每一列 { string cellValue = row.GetCell(j).ToString(); //获取i行j列数据 Console.WriteLine(cellValue); dr[j] = cellValue; } } dt.Rows.Add(dr); } Console.ReadLine(); fileStream.Close(); return dt; }
提供Excel文件的路径,返回一个datatable对象。
下面是将datatable对象保存为Excel文件(测试.xls后缀没问题,貌似.xlsx后缀有点问题)
复制
public static bool DataTableToExcel(String path, DataTable dt) { bool result = false; IWorkbook workbook = null; FileStream fs = null; IRow row = null; ISheet sheet = null; ICell cell = null; try { if (dt != null && dt.Rows.Count > 0) { workbook = new HSSFWorkbook(); sheet = workbook.CreateSheet("Sheet0");//创建一个名称为Sheet0的表 int rowCount = dt.Rows.Count;//行数 int columnCount = dt.Columns.Count;//列数 //设置列头 row = sheet.CreateRow(0);//excel第一行设为列头 for (int c = 0; c < columnCount; c++) { cell = row.CreateCell(c); cell.SetCellValue(dt.Columns[c].ColumnName); } //设置每行每列的单元格, for (int i = 0; i < rowCount; i++) { row = sheet.CreateRow(i + 1); for (int j = 0; j < columnCount; j++) { cell = row.CreateCell(j);//excel第二行开始写入数据 cell.SetCellValue(dt.Rows[i][j].ToString()); } } using (fs = File.OpenWrite(path)) { workbook.Write(fs);//向打开的这个xls文件中写入数据 result = true; } } return result; } catch (Exception ex) { MessageBox.Show(ex.ToString()); if (fs != null) { fs.Close(); } return false; } }
提供Excel保存路径及datatable数据对象,成功返回真,失败返回假。
评论 (0)