zoukankan      html  css  js  c++  java
  • 【转】NPOI读写Excel

    1、整个Excel表格叫做工作表:WorkBook(工作薄),包含的叫页(工作表):Sheet;行:Row;单元格Cell。

    2、NPOI是POI的C#版本,NPOI的行和列的index都是从0开始

    3、POI读取Excel有两种格式一个是HSSF,另一个是XSSF。 HSSF和XSSF的区别如下: 
    HSSF is the POI Project's pure Java implementation of the Excel '97(-2007) file format. 
    XSSF is the POI Project's pure Java implementation of the Excel 2007 OOXML (.xlsx) file format. 
    即:HSSF适用2007以前的版本,XSSF适用2007版本及其以上的。

    下面是用NPOI读写Excel的例子:ExcelHelper封装的功能主要是把DataTable中数据写入到Excel中,或者是从Excel读取数据到一个DataTable中。

     ExcelHelper类:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using NPOI.SS.UserModel;
    using NPOI.XSSF.UserModel;
    using NPOI.HSSF.UserModel;
    using System.IO;
    using System.Data;

    namespace NetUtilityLib
    {
    public class ExcelHelper : IDisposable
    {
    private string fileName = null; //文件名
    private IWorkbook workbook = null;
    private FileStream fs = null;
    private bool disposed;

    public ExcelHelper(string fileName)
    {
    this.fileName = fileName;
    disposed = false;
    }

    /// <summary>
    /// 将DataTable数据导入到excel中
    /// </summary>
    /// <param name="data">要导入的数据</param>
    /// <param name="isColumnWritten">DataTable的列名是否要导入</param>
    /// <param name="sheetName">要导入的excel的sheet的名称</param>
    /// <returns>导入数据行数(包含列名那一行)</returns>
    public int DataTableToExcel(DataTable data, string sheetName, bool isColumnWritten)
    {
    int i = 0;
    int j = 0;
    int count = 0;
    ISheet sheet = null;

    fs = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite);
    if (fileName.IndexOf(".xlsx") > 0) // 2007版本
    workbook = new XSSFWorkbook();
    else if (fileName.IndexOf(".xls") > 0) // 2003版本
    workbook = new HSSFWorkbook();

    try
    {
    if (workbook != null)
    {
    sheet = workbook.CreateSheet(sheetName);
    }
    else
    {
    return -1;
    }

    if (isColumnWritten == true) //写入DataTable的列名
    {
    IRow row = sheet.CreateRow(0);
    for (j = 0; j < data.Columns.Count; ++j)
    {
    row.CreateCell(j).SetCellValue(data.Columns[j].ColumnName);
    }
    count = 1;
    }
    else
    {
    count = 0;
    }

    for (i = 0; i < data.Rows.Count; ++i)
    {
    IRow row = sheet.CreateRow(count);
    for (j = 0; j < data.Columns.Count; ++j)
    {
    row.CreateCell(j).SetCellValue(data.Rows[i][j].ToString());
    }
    ++count;
    }
    workbook.Write(fs); //写入到excel
    return count;
    }
    catch (Exception ex)
    {
    Console.WriteLine("Exception: " + ex.Message);
    return -1;
    }
    }

    /// <summary>
    /// 将excel中的数据导入到DataTable中
    /// </summary>
    /// <param name="sheetName">excel工作薄sheet的名称</param>
    /// <param name="isFirstRowColumn">第一行是否是DataTable的列名</param>
    /// <returns>返回的DataTable</returns>
    public DataTable ExcelToDataTable(string sheetName, bool isFirstRowColumn)
    {
    ISheet sheet = null;
    DataTable data = new DataTable();
    int startRow = 0;
    try
    {
    fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
    if (fileName.IndexOf(".xlsx") > 0) // 2007版本
    workbook = new XSSFWorkbook(fs);
    else if (fileName.IndexOf(".xls") > 0) // 2003版本
    workbook = new HSSFWorkbook(fs);

    if (sheetName != null)
    {
    sheet = workbook.GetSheet(sheetName);
    if (sheet == null) //如果没有找到指定的sheetName对应的sheet,则尝试获取第一个sheet
    {
    sheet = workbook.GetSheetAt(0);
    }
    }
    else
    {
    sheet = workbook.GetSheetAt(0);
    }
    if (sheet != null)
    {
    IRow firstRow = sheet.GetRow(0);
    int cellCount = firstRow.LastCellNum; //一行最后一个cell的编号 即总的列数

    if (isFirstRowColumn)
    {
    for (int i = firstRow.FirstCellNum; i < cellCount; ++i)
    {
    ICell cell = firstRow.GetCell(i);
    if (cell != null)
    {
    string cellValue = cell.StringCellValue;
    if (cellValue != null)
    {
    DataColumn column = new DataColumn(cellValue);
    data.Columns.Add(column);
    }
    }
    }
    startRow = sheet.FirstRowNum + 1;
    }
    else
    {
    startRow = sheet.FirstRowNum;
    }

    //最后一列的标号
    int rowCount = sheet.LastRowNum;
    for (int i = startRow; i <= rowCount; ++i)
    {
    IRow row = sheet.GetRow(i);
    if (row == null) continue; //没有数据的行默认是null       

    DataRow dataRow = data.NewRow();
    for (int j = row.FirstCellNum; j < cellCount; ++j)
    {
    if (row.GetCell(j) != null) //同理,没有数据的单元格都默认是null
    dataRow[j] = row.GetCell(j).ToString();
    }
    data.Rows.Add(dataRow);
    }
    }

    return data;
    }
    catch (Exception ex)
    {
    Console.WriteLine("Exception: " + ex.Message);
    return null;
    }
    }

    public void Dispose()
    {
    Dispose(true);
    GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing)
    {
    if (!this.disposed)
    {
    if (disposing)
    {
    if (fs != null)
    fs.Close();
    }

    fs = null;
    disposed = true;
    }
    }
    }
    }

    --===================对于Excel模板,向模板中填充数据且保存

    using(fs = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite))

    {
    if (fileName.IndexOf(".xlsx") > 0) // 2007版本
     workbook = new XSSFWorkbook(fs);
    else if (fileName.IndexOf(".xls") > 0) // 2003版本
     workbook = new HSSFWorkbook(fs);

    }

    using(fs = new FileStream(fileName, FileMode.Create))

    {

      for (i = 0; i < data.Rows.Count; ++i)
    {
    IRow row = sheet.GetRow(count);
    for (j = 0; j < data.Columns.Count; ++j)
    {
    row.CreateCell(j).SetCellValue(data.Rows[i][j].ToString());
    }
    ++count;
    }

    workbook.Write(fs);//写入Excel

    }

  • 相关阅读:
    Atitit 人脸识别 眼睛形态 attilax总结
    Atitit 手机号码选号 规范 流程 attilax总结 v2 r99.docx
    atitit 板块分类 上市公司 龙头企业公司 列表 attilax总结.docx
    Atititi atiitt eam pam资产管理 购物表去年.xlsx
    使用cmd查看电脑连接过的wifi密码(一)
    常见十大web攻击手段 悟寰轩
    常见web攻击方式 悟寰轩
    【MYSQL数据库】MYSQL学习笔记mysql分区基本操作 悟寰轩
    Filter及FilterChain的使用详解 悟寰轩
    启动tomcat spring初始化两次问题(eg:@PostConstruct) 悟寰轩
  • 原文地址:https://www.cnblogs.com/yxhblog/p/7084027.html
Copyright © 2011-2022 走看看