NPOI导入导出Excel

本文详细介绍了如何利用NPOI库在.NET环境中进行Excel数据的导出和导入。首先,展示了如何从代码生成Excel文件,接着演示了使用Excel模板填充数据的方法。此外,还提供了读取Excel数据并导入到数据库的示例代码,适用于简单和复杂场景。注意,根据Excel文件版本选择合适的NPOI工作簿类型。
摘要由CSDN通过智能技术生成

为什么选择NPOI
  • NPOI是Apache POI的.Net 版本,Apache POI是一种流行的API,允许程序员使用Java程序创建,修改和显示MS Office文件。
  • NPOI为国内开发的开源项目,文档完善,更新及时,开发便利
  • 对NPOI的介绍和分析参考百度百科:https://baike.baidu.com/item/NPOI/10374941?fr=aladdin
使用NPOI导出数据到Excel(Excel文件由代码生成)
  • 该方案适用于Excel文件表头比较简单的情况(无多种单元格合并)
  • 示例代码采用.net framework 窗体程序
private void exportButton_Click(object sender, EventArgs e)
        {
            // 填充学生信息
            List<Student> students = new List<Student>();
            for(int i = 0; i < 5; i++)
            {
                Student student = new Student();
                student.id = "1";
                student.sex = "男";
                student.name = "帅" + i.ToString();
                student.physics = "8" + i.ToString();
                student.chemistry = "9" + i.ToString();
                student.history = "7" + i.ToString();
                student.geography = "6" + i.ToString();
                students.Add(student);
            }

            // 创建DataTable 提供Excel数据
            DataTable dataTable = new DataTable();
            dataTable.Columns.Add("序号", typeof(string));
            dataTable.Columns.Add("性别", typeof(string));
            dataTable.Columns.Add("姓名", typeof(string));
            dataTable.Columns.Add("物理", typeof(string));
            dataTable.Columns.Add("化学", typeof(string));
            dataTable.Columns.Add("历史", typeof(string));
            dataTable.Columns.Add("地理", typeof(string));
            for(int i = 0; i < students.Count; i++)
            {
                DataRow dataRow = dataTable.NewRow();
                dataRow["序号"] = i + 1;
                dataRow["性别"] = students[i].sex;
                dataRow["姓名"] = students[i].name;
                dataRow["物理"] = students[i].physics;
                dataRow["化学"] = students[i].chemistry;
                dataRow["历史"] = students[i].history;
                dataRow["地理"] = students[i].geography;
                // 将这行数据添加到dataTable中
                dataTable.Rows.Add(dataRow);
            }

            // 将数据导出
            // saveFileDialog1为窗体组件SaveFileDialog
            if (saveFileDialog1.ShowDialog() == DialogResult.OK)
            {
                string filePath = saveFileDialog1.FileName;
                ExcelHelper.ExportExcel(dataTable, filePath);

            }
        }
        
// 工具类
public static void ExportExcel(DataTable dataTable,string filePath)
{
    // 创建工作簿
    HSSFWorkbook hSSFWorkbook = new HSSFWorkbook();

    // 创建不同的工作表 存不同项目的数据
    ISheet sheetA = hSSFWorkbook.CreateSheet("成绩1");
    ISheet sheetB = hSSFWorkbook.CreateSheet("成绩2");
    ISheet sheetC = hSSFWorkbook.CreateSheet("成绩3");

    // 向excel中填充内容
    // 填充表头
    IRow dataRow = sheetA.CreateRow(0);
    foreach (DataColumn column in dataTable.Columns)
    {
    	dataRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);
    }
    // 填充内容
    for (int i = 0; i < dataTable.Rows.Count; i++)
    {
    	dataRow = sheetA.CreateRow(i + 1);
    for (int j = 0; j < dataTable.Columns.Count; j++)
    {
    	dataRow.CreateCell(j).SetCellValue(dataTable.Rows[i][j].ToString());
    }
    }

    // 将文件输出
    FileStream file = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Write);
    //创建一个IO流(内存流类,主要用于操作内存中的数据)
    MemoryStream ms = new MemoryStream();
    //写入到流
    hSSFWorkbook.Write(ms);
    var bytes = ms.ToArray();
    file.Write(bytes, 0, bytes.Length);
    //定时的强制写入文件,可以防止丢失大部分数据
    file.Flush();
    ms.Close();
    ms.Dispose();
    //写入到流
    //workbook.Write(file);
    file.Close();
    file.Dispose();

    hSSFWorkbook.Close();

}
  • 导出样例
    在这里插入图片描述
使用NPOI导出数据到Excel(使用Excel模板)
  • 该方案通过读取设计好的Excel模板,向文件中填充数据,模板包括表头列头和样式

  • 模板样式
    在这里插入图片描述

  • 代码示例

// 工具类
public static void ExportExcel(DataTable dataTable,string filePath)
{
    string filrUrl = "C:\\student.xls";
    FileStream file = new FileStream(filrUrl, FileMode.Open, FileAccess.Read);
    // 创建工作簿
    HSSFWorkbook hSSFWorkbook = new HSSFWorkbook(file);

    // 创建不同的工作表 存不同项目的数据
    ISheet sheetA = hSSFWorkbook.GetSheet("Sheet1");
    ISheet sheetB = hSSFWorkbook.GetSheet("Sheet2");
    ISheet sheetC = hSSFWorkbook.GetSheet("Sheet3");

    // 向excel中填充内容
    // 填充表头
    IRow dataRow;
    // 填充内容
    for (int i = 0; i < dataTable.Rows.Count; i++)
    {
    dataRow = sheetA.CreateRow(i + 2);
    for (int j = 0; j < dataTable.Columns.Count; j++)
    {
    dataRow.CreateCell(j).SetCellValue(dataTable.Rows[i][j].ToString());
    }
    }

    // 将文件输出
    FileStream resultFile = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Write);
    //创建一个IO流(内存流类,主要用于操作内存中的数据)
    MemoryStream ms = new MemoryStream();
    //写入到流
    hSSFWorkbook.Write(ms);
    var bytes = ms.ToArray();
    resultFile.Write(bytes, 0, bytes.Length);
    //定时的强制写入文件,可以防止丢失大部分数据
    resultFile.Flush();
    ms.Close();
    ms.Dispose();
    //写入到流
    //workbook.Write(file);
    resultFile.Close();
    resultFile.Dispose();

    hSSFWorkbook.Close();

}
  • 导出结果
    在这里插入图片描述
使用NPOI读取Excel导入数据到数据库
  • Excel数据文件
    在这里插入图片描述

  • 代码示例

private void importButton_Click(object sender, EventArgs e)
{
// 使用OpenFileDialog窗体组件打开文件
    if (openFileDialog1.ShowDialog() == DialogResult.OK)
    {
        DataTable dataTable;
        string sheetName = "成绩1";
        dataTable = ExcelHelper.importExcel(openFileDialog1.FileName, sheetName);
        if (dataTable != null)
        {
        for (int i = 0; i < dataTable.Rows.Count; i++)
        {
        Student student = new Student();
        student.id = i.ToString();
        student.sex = dataTable.Rows[i][1].ToString();
        student.name = dataTable.Rows[i][2].ToString();
        student.physics = dataTable.Rows[i][3].ToString();
        student.chemistry = dataTable.Rows[i][4].ToString();
        student.history = dataTable.Rows[i][5].ToString();
        student.geography = dataTable.Rows[i][6].ToString();
        Console.WriteLine(student.ToString());
        }

        }

    }
}

// Excel工具类
public static DataTable importExcel(string filePath, string sheetName)
{
    IWorkbook workbook;
    using (var file = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
    {
    workbook = new HSSFWorkbook(file);
    }
    ISheet sheet = workbook.GetSheet(sheetName);

    DataTable dataTable = new DataTable();
    //第一行标题
    var headerRow = sheet.GetRow(0);
    var cellCount = headerRow.LastCellNum;
    for (int i = headerRow.FirstCellNum; i < cellCount; i++)
    {
    var column = new DataColumn(headerRow.GetCell(i).StringCellValue);
    dataTable.Columns.Add(column);
    }
    // 读取数据
    for (int j = sheet.FirstRowNum + 1; j <= sheet.LastRowNum; j++)
    {
    var row = sheet.GetRow(j);
    var dataRow = dataTable.NewRow();

    if (row != null)
    {
    for (int i = 0; i < row.LastCellNum; i++)
    {
    var cell = row.GetCell(i);
    if (cell == null)
    {
    dataRow[i] = null;
    }
    else
    {
    dataRow[i] = cell.ToString();
    }
    }
    dataTable.Rows.Add(dataRow);
    }
    }

    return dataTable;
}
  • 从Excel文件中导出结果
    在这里插入图片描述
注意事项
  • 如果使用Excel模板导出时,如果模板文件的扩展名为 .xlsx 时使用 new XSSFWorkbook(),2007版本
  • 如果使用Excel模板导出时,如果模板文件的扩展名为 .xls 时使用 new HSSFWorkbook(),2003版本
  • NPOI项目所在GitHub地址:https://github.com/nissl-lab/npoi
  • 参考文档:https://www.cnblogs.com/joean/p/4661056.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值