在C#中,使用NPOI库将表格数据导入Excel的操作相对直接。NPOI是.NET版本的POI,可以帮助我们在没有安装Microsoft Office的情况下读写Office文件,如xls和xlsx。以下是使用NPOI将DataTable导出到Excel的基本步骤:
-
创建工作簿:首先,你需要创建一个
IWorkbook
对象,这是Excel文件的开始。 -
创建工作表:使用
workbook.CreateSheet("Sheet1")
创建一个新的工作表。 -
创建表头:通过遍历
DataTable
的列来创建Excel文件的表头。 -
填充数据:遍历
DataTable
的每一行,并为每个单元格填充数据。 -
写入文件:最后,将工作簿写入到文件流中,保存为Excel文件。
下面是一个简单的示例代码,展示了如何将DataTable
导出到Excel文件:
using NPOI.XSSF.UserModel; // 用于处理xlsx文件
using NPOI.HSSF.UserModel; // 用于处理xls文件
using System.Data;
using System.IO;
public void ExportToExcel(DataTable dt, string filePath)
{
IWorkbook workbook;
// 根据文件扩展名选择工作簿类型
if (Path.GetExtension(filePath).Equals(".xlsx", StringComparison.OrdinalIgnoreCase))
{
workbook = new XSSFWorkbook();
}
else
{
workbook = new HSSFWorkbook();
}
ISheet sheet = workbook.CreateSheet("Sheet1");
// 创建表头
IRow headerRow = sheet.CreateRow(0);
for (int i = 0; i < dt.Columns.Count; i++)
{
headerRow.CreateCell(i).SetCellValue(dt.Columns[i].ColumnName);
}
// 填充数据
for (int i = 0; i < dt.Rows.Count; i++)
{
IRow row = sheet.CreateRow(i + 1);
for (int j = 0; j < dt.Columns.Count; j++)
{
row.CreateCell(j).SetCellValue(dt.Rows[i][j].ToString());
}
}
// 写入文件
using (FileStream fileStream = new FileStream(filePath, FileMode.Create, FileAccess.Write))
{
workbook.Write(fileStream);
}
}
在上述代码中,我们首先检查文件扩展名来决定创建XSSFWorkbook
(用于.xlsx
文件)还是HSSFWorkbook
(用于.xls
文件)。然后,我们创建一个工作表,并填充表头和数据。最后,我们将工作簿写入到指定的文件路径。
实际中第一步
private void BtnDerive_Click(object sender, EventArgs e)
{
SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.Filter = "Excel files (*.xlsx)|*.xlsx";
saveFileDialog.Title = "选择导出文件保存位置";
saveFileDialog.FileName = GetFileName();
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
Export(dataGridView1, saveFileDialog.FileName);
}
}
private string GetFileName()
{
return $"产品类型表_{DateTime.Now:yyyyMMddHHmmss}.xlsx";
}
private void Export(DataGridView dgv, string fileName)
{
try
{
IWorkbook wb = new XSSFWorkbook();
//NPOI 使用HSSFWorkbook 类来处理 xls,XSSFWorkbook 类来处理 xlsx。
//它们都继承接口 IWorkbook,通过 IWorkbook 来统一处理 xls 和 xlsx 格式的文件
ISheet sheet = wb.CreateSheet();
IRow row;
//获取DataGridView的列名,其中 i 表示低级列,i从0开始
row = sheet.CreateRow(0);
// 生成标题,注意第一列是“操作”列,不处理
for (int k = 1; k < dgv.Columns.Count; k++)
{
row.CreateCell(k - 1).SetCellValue(dgv.Columns[k].HeaderText.ToString());
}
for (int i = 0; i < dgv.Rows.Count; i++)
{
row = sheet.CreateRow(i + 1);
for (int k = 1; k < dgv.Columns.Count; k++)
{
string value = dgv.Rows[i].Cells[k].Value == null ? "" : dgv.Rows[i].Cells[k].Value.ToString();
row.CreateCell(k - 1).SetCellValue(value);
}
}
using (var fs = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite))
{
wb.Write(fs); //写入到Excel中
}
MessageBox.Show("保存成功,文件名:" + fileName, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}