重要:本文最后更新于2018-05-11 09:54:31,某些文章具有时效性,若有错误或已失效,请在下方留言或联系代码狗。
这两天在做一个故障报修系统,其中需要用到表格来统计记录信息,第一反应是弄个MySQL,安全可靠,别人改不了。然而…电脑比较老,带不动,又想用sqlite这种轻量级的数据库,又由于各种原因,放弃了sqlite,最终选择了Excel,因为它简单,快捷,就是不够安全。
操作Excel的方法很多,微软也提供了office组件,C#可以调用。如果对方电脑没装ofice那就尴尬了,用不了。不过代码狗今天讲的方法是不需要ofice组件支持的。
本文所需支持库在文章末尾有分享,看到最后哟!
先看看功能效果:
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数据对象,成功返回真,失败返回假。