C#读写Excel表格文件NPOI方式无需安装office

这两天在做一个故障报修系统,其中需要用到表格来统计记录信息,第一反应是弄个MySQL,安全可靠,别人改不了。然而…电脑比较老,带不动,又想用sqlite这种轻量级的数据库,又由于各种原因,放弃了sqlite,最终选择了Excel,因为它简单,快捷,就是不够安全。

操作Excel的方法很多,微软也提供了office组件,C#可以调用。如果对方电脑没装ofice那就尴尬了,用不了。不过代码狗今天讲的方法是不需要ofice组件支持的。

本文所需支持库在文章末尾有分享,看到最后哟!

先看看功能效果:

C#读写Excel表格文件NPOI方式无需安装office

C#读写Excel表格文件NPOI方式无需安装office

C#读写Excel表格文件NPOI方式无需安装office

C#读写Excel表格文件NPOI方式无需安装office

首先下载文章末尾的支持库,添加引用到你的工程中,并使用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数据对象,成功返回真,失败返回假。

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/241278.html

(0)
上一篇 2022年4月7日 00:26
下一篇 2022年4月7日 00:26

相关推荐

发表回复

登录后才能评论