C# NPOI 操作excel

转载的文章,方便自己查看。

        一、下载NPOI:http://down.gougou.com/down?cid=DAEA322D9D7F934B898077FB01C3A8CB02A746E6

  二、项目添加引用;

  三、首先把如下代码封装成一个ExcelHelper类;

  四、调用方法。

  

  1、导出:分为DataSet多表导出,DataTable单表导出

  首先解析一下由DataSet导出Excel 


C NPOI 操作excel - abao8_111 - 心之归处C NPOI 操作excel - abao8_111 - 心之归处代码

using System;
using System.Data;
using System.IO;
using System.Web;
using NPOI;
using NPOI.HPSF;
using NPOI.HSSF;
using NPOI.HSSF.UserModel;
using NPOI.POIFS;
using NPOI.Util;
using System.Text;
public class ExcelHelper
{
    /// <summary>
    /// 由DataSet导出Excel
    /// </summary>
    /// <param name="sourceTable">要导出数据的DataTable</param>
    /// <param name="sheetName">工作表名称</param>
    /// <returns>Excel工作表</returns>
    private static Stream ExportDataSetToExcel(DataSet sourceDs, string sheetName)
    {
        HSSFWorkbook workbook = new HSSFWorkbook();
        MemoryStream ms = new MemoryStream();
        string [] sheetNames = sheetName.Split(',');
        for(int i = 0;i< sheetNames.Length; i++)
        {
            HSSFSheet sheet = workbook.CreateSheet(sheetNames[i]);
            HSSFRow headerRow = sheet.CreateRow(0);
            // handling header.
            foreach (DataColumn column in sourceDs.Tables[i].Columns)
                headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);
// handling value.
            int rowIndex = 1;
foreach (DataRow row in sourceDs.Tables[i].Rows)
            {
                HSSFRow dataRow = sheet.CreateRow(rowIndex);
foreach (DataColumn column in sourceDs.Tables[i].Columns)
                {
                dataRow.CreateCell(column.Ordinal).SetCellValue(row[column].ToString());
                }
rowIndex++;
            }
        }
        workbook.Write(ms);
        ms.Flush();
        ms.Position = 0;
workbook = null;
        return ms;
    }
/// <summary>
    /// 由DataSet导出Excel
    /// </summary>
    /// <param name="sourceTable">要导出数据的DataTable</param>
    /// <param name="fileName">指定Excel工作表名称</param>
    /// <returns>Excel工作表</returns>
    public static void ExportDataSetToExcel(DataSet sourceDs, string fileName, string sheetName)
    {
        MemoryStream ms = ExportDataSetToExcel(sourceDs, sheetName) as MemoryStream;
        HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment;filename=" + fileName); 
        HttpContext.Current.Response.BinaryWrite(ms.ToArray());
        HttpContext.Current.Response.End();
        ms.Close();
        ms = null;
    }


 

  由DataTable导出Excel  


C NPOI 操作excel - abao8_111 - 心之归处C NPOI 操作excel - abao8_111 - 心之归处代码

/// <summary>
    /// 由DataTable导出Excel
    /// </summary>
    /// <param name="sourceTable">要导出数据的DataTable</param>
    /// <returns>Excel工作表</returns>
    private static Stream ExportDataTableToExcel(DataTable sourceTable, string sheetName)
    {
        HSSFWorkbook workbook = new HSSFWorkbook();
        MemoryStream ms = new MemoryStream();
        HSSFSheet sheet = workbook.CreateSheet(sheetName);
        HSSFRow headerRow = sheet.CreateRow(0);
        // handling header.
        foreach (DataColumn column in sourceTable.Columns)
            headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);
// handling value.
        int rowIndex = 1;
foreach (DataRow row in sourceTable.Rows)
        {
            HSSFRow dataRow = sheet.CreateRow(rowIndex);
foreach (DataColumn column in sourceTable.Columns)
            {
                dataRow.CreateCell(column.Ordinal).SetCellValue(row[column].ToString());
            }
rowIndex++;
        }
workbook.Write(ms);
        ms.Flush();
        ms.Position = 0;
sheet = null;
        headerRow = null;
        workbook = null;
return ms;
    }
    /// <summary>
    /// 由DataTable导出Excel
    /// </summary>
    /// <param name="sourceTable">要导出数据的DataTable</param>
    /// <param name="fileName">指定Excel工作表名称</param>
    /// <returns>Excel工作表</returns>
    public static void ExportDataTableToExcel(DataTable sourceTable, string fileName, string sheetName)
    {
        MemoryStream ms = ExportDataTableToExcel(sourceTable, sheetName) as MemoryStream;
        HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment;filename=" + fileName); 
        HttpContext.Current.Response.BinaryWrite(ms.ToArray());
        HttpContext.Current.Response.End();
        ms.Close();
        ms = null;
    }


 

  2、导入

  由Excel导入DataTable


C NPOI 操作excel - abao8_111 - 心之归处C NPOI 操作excel - abao8_111 - 心之归处代码

  /// <summary>
    /// 由Excel导入DataTable
    /// </summary>
    /// <param name="excelFileStream">Excel文件流</param>
    /// <param name="sheetName">Excel工作表名称</param>
    /// <param name="headerRowIndex">Excel表头行索引</param>
    /// <returns>DataTable</returns>
    public static DataTable ImportDataTableFromExcel(Stream excelFileStream, string sheetName, int headerRowIndex)
    {
        HSSFWorkbook workbook = new HSSFWorkbook(excelFileStream);
        HSSFSheet sheet = workbook.GetSheet(sheetName);
DataTable table = new DataTable();
HSSFRow headerRow = sheet.GetRow(headerRowIndex);
        int cellCount = headerRow.LastCellNum;
for (int i = headerRow.FirstCellNum; i < cellCount; i++)
        {
            DataColumn column = new DataColumn(headerRow.GetCell(i).StringCellValue);
            table.Columns.Add(column);
        }
for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++)
        {
            HSSFRow row = sheet.GetRow(i);
            DataRow dataRow = table.NewRow();
for (int j = row.FirstCellNum; j < cellCount; j++)
                dataRow[j] = row.GetCell(j).ToString();
        }
excelFileStream.Close();
        workbook = null;
        sheet = null;
        return table;
    }
/// <summary>
    /// 由Excel导入DataTable
    /// </summary>
    /// <param name="excelFilePath">Excel文件路径,为物理路径。</param>
    /// <param name="sheetName">Excel工作表名称</param>
    /// <param name="headerRowIndex">Excel表头行索引</param>
    /// <returns>DataTable</returns>
    public static DataTable ImportDataTableFromExcel(string excelFilePath, string sheetName, int headerRowIndex)
    {
        using (FileStream stream = System.IO.File.OpenRead(excelFilePath))
        {
            return ImportDataTableFromExcel(stream, sheetName, headerRowIndex);
        }
    }
/// <summary>
    /// 由Excel导入DataTable
    /// </summary>
    /// <param name="excelFileStream">Excel文件流</param>
    /// <param name="sheetName">Excel工作表索引</param>
    /// <param name="headerRowIndex">Excel表头行索引</param>
    /// <returns>DataTable</returns>
    public static DataTable ImportDataTableFromExcel(Stream excelFileStream, int sheetIndex, int headerRowIndex)
    {
        HSSFWorkbook workbook = new HSSFWorkbook(excelFileStream);
        HSSFSheet sheet = workbook.GetSheetAt(sheetIndex);
DataTable table = new DataTable();
HSSFRow headerRow = sheet.GetRow(headerRowIndex);
        int cellCount = headerRow.LastCellNum;
for (int i = headerRow.FirstCellNum; i < cellCount; i++)
        {
            if (headerRow.GetCell(i) == null || headerRow.GetCell(i).StringCellValue.Trim() == "")
            {
                // 如果遇到第一个空列,则不再继续向后读取
                cellCount = i + 1;
                break;
            }
            DataColumn column = new DataColumn(headerRow.GetCell(i).StringCellValue);
            table.Columns.Add(column);
        }
for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++)
        {
            HSSFRow row = sheet.GetRow(i);
            if (row == null || row.GetCell(0) == null || row.GetCell(0).ToString().Trim() == "")
            {
                // 如果遇到第一个空行,则不再继续向后读取
                break;
            }
DataRow dataRow = table.NewRow();
            for (int j = row.FirstCellNum; j < cellCount; j++)
            {
                dataRow[j] = row.GetCell(j);                
            }
            table.Rows.Add(dataRow);
        }
        excelFileStream.Close();
        workbook = null;
        sheet = null;
        return table;
    }
    /// <summary>
    /// 由Excel导入DataTable
    /// </summary>
    /// <param name="excelFilePath">Excel文件路径,为物理路径。</param>
    /// <param name="sheetName">Excel工作表索引</param>
    /// <param name="headerRowIndex">Excel表头行索引</param>
    /// <returns>DataTable</returns>
    public static DataTable ImportDataTableFromExcel(string excelFilePath, int sheetIndex, int headerRowIndex)
    {
        using (FileStream stream = System.IO.File.OpenRead(excelFilePath))
        {
            return ImportDataTableFromExcel(stream, sheetIndex, headerRowIndex);
        }
    }


 

   有Excel导入DataSet  


C NPOI 操作excel - abao8_111 - 心之归处C NPOI 操作excel - abao8_111 - 心之归处代码

  /// <summary>
    /// 由Excel导入DataSet,如果有多个工作表,则导入多个DataTable
    /// </summary>
    /// <param name="excelFileStream">Excel文件流</param>
    /// <param name="headerRowIndex">Excel表头行索引</param>
    /// <returns>DataSet</returns>
    public static DataSet ImportDataSetFromExcel(Stream excelFileStream, int headerRowIndex)
    {
        DataSet ds = new DataSet();
        HSSFWorkbook workbook = new HSSFWorkbook(excelFileStream);
        for (int a = 0, b = workbook.NumberOfSheets; a < b; a++)
        {
            HSSFSheet sheet = workbook.GetSheetAt(a);
            DataTable table = new DataTable();
HSSFRow headerRow = sheet.GetRow(headerRowIndex);
            int cellCount = headerRow.LastCellNum;
            for (int i = headerRow.FirstCellNum; i < cellCount; i++)
            {
                if (headerRow.GetCell(i) == null || headerRow.GetCell(i).StringCellValue.Trim() == "")
                {
                    // 如果遇到第一个空列,则不再继续向后读取
                    cellCount = i + 1;
                    break;
                }
DataColumn column = new DataColumn(headerRow.GetCell(i).StringCellValue);
                table.Columns.Add(column);
            }
for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum ; i++)
            {
                HSSFRow row = sheet.GetRow(i);
                if (row == null || row.GetCell(0) == null || row.GetCell(0).ToString().Trim() == "")
                {
                    // 如果遇到第一个空行,则不再继续向后读取
                    break;
                }
DataRow dataRow = table.NewRow();
                for (int j = row.FirstCellNum; j < cellCount; j++)
                {
                    if (row.GetCell(j) != null)
                    {
                        dataRow[j] = row.GetCell(j).ToString();
                    }
                }
table.Rows.Add(dataRow);
            }
            ds.Tables.Add(table);
        }
excelFileStream.Close();
        workbook = null;
return ds;
    }
/// <summary>
    /// 由Excel导入DataSet,如果有多个工作表,则导入多个DataTable
    /// </summary>
    /// <param name="excelFilePath">Excel文件路径,为物理路径。</param>
    /// <param name="headerRowIndex">Excel表头行索引</param>
    /// <returns>DataSet</returns>
    public static DataSet ImportDataSetFromExcel(string excelFilePath, int headerRowIndex)
    {
        using (FileStream stream = System.IO.File.OpenRead(excelFilePath))
        {
            return ImportDataSetFromExcel(stream, headerRowIndex);
        }
    }


 

  另外为导入补充一点知识:

  1、将Excel的列索引转换为列名,列索引从0开始,列名从A开始。如第0列为A,第1列为B...  


C NPOI 操作excel - abao8_111 - 心之归处C NPOI 操作excel - abao8_111 - 心之归处代码

/// <summary>
    /// 将Excel的列索引转换为列名,列索引从0开始,列名从A开始。如第0列为A,第1列为B...
    /// </summary>
    /// <param name="index">列索引</param>
    /// <returns>列名,如第0列为A,第1列为B...</returns>
    public static string ConvertColumnIndexToColumnName(int index)
    {
        index = index + 1;
        int system = 26;
        char[] digArray = new char[100];
        int i = 0;
        while (index > 0)
        {
            int mod = index % system;
            if (mod == 0) mod = system;
            digArray[i++] = (char)(mod - 1 + 'A');
            index = (index - 1) / 26;
        }
        StringBuilder sb = new StringBuilder(i);
        for (int j = i - 1; j >= 0; j--) 
        {
            sb.Append(digArray[j]);
        }
        return sb.ToString(); 
    }


 

   2、当从Excel获取年月日时,会从在一定的问题,应该在一下代码中,可以想到存在的问题,所以我们可以写个方法封装一下: 


C NPOI 操作excel - abao8_111 - 心之归处C NPOI 操作excel - abao8_111 - 心之归处代码

    /// <summary>
    /// 转化日期
    /// </summary>
    /// <param name="date">日期</param>
    /// <returns></returns>
    public static DateTime ConvertDate(string date)
    {
        DateTime dt = new DateTime();
        string[] time = date.Split('-');
        int year = Convert.ToInt32(time[2]);
        int month = Convert.ToInt32(time[0]);
        int day = Convert.ToInt32(time[1]);
        string years = Convert.ToString(year);
        string months = Convert.ToString(month);
        string days = Convert.ToString(day);
        if(months.Length == 4)
        {
            dt = Convert.ToDateTime(date);
        }
        else
        {
            string rq = "";
            if(years.Length == 1)
            {
                years = "0" + years;
            }
            if(months.Length == 1)
            {
                months = "0" + months;
            }
            if(days.Length == 1)
            {
                days = "0" + days;
            }
            rq = "20" + years + "-" + months  + "-" + days;
            dt = Convert.ToDateTime(rq);
        }
        return dt;
    }
}
原文地址:https://www.cnblogs.com/shiyh/p/7478229.html