zoukankan      html  css  js  c++  java
  • NpoI

    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.IO;
    using System.Text;
    using System.Web;
    using NPOI;
    using NPOI.HPSF;
    using NPOI.HSSF;
    using NPOI.HSSF.UserModel;
    using NPOI.HSSF.Util;
    using NPOI.POIFS;
    using NPOI.Util;
    using NPOI.SS.UserModel;
    using NPOI.SS.Util;

    namespace ERN.Tools.Common
    {
    /// <summary>
    /// NPOI操作帮助类
    /// </summary>
    public class NPOIHelper
    {
    /// <summary>
    /// DataTable导出到Excel文件
    /// </summary>
    /// <param name="dtSource">源DataTable</param>
    /// <param name="strHeaderText">表头文本</param>
    /// <param name="strFileName">保存位置</param>
    public static void Export(DataTable dtSource, string strHeaderText, string strFileName)
    {
    using (MemoryStream ms = Export(dtSource, strHeaderText))
    {
    using (FileStream fs = new FileStream(strFileName, FileMode.Create, FileAccess.Write))
    {
    byte[] data = ms.ToArray();
    fs.Write(data, 0, data.Length);
    fs.Flush();
    }
    }
    }

    /// <summary>
    /// DataTable导出到Excel的MemoryStream
    /// </summary>
    /// <param name="dtSource">源DataTable</param>
    /// <param name="strHeaderText">表头文本</param>
    public static MemoryStream Export(DataTable dtSource, string strHeaderText)
    {
    HSSFWorkbook workbook = new HSSFWorkbook();
    ISheet sheet = workbook.CreateSheet();

    ICellStyle dateStyle = workbook.CreateCellStyle();
    IDataFormat format = workbook.CreateDataFormat();
    dateStyle.DataFormat = format.GetFormat("yyyy-MM-dd");

    #region 取得每列的列宽(最大宽度)
    int[] arrColWidth = new int[dtSource.Columns.Count];
    foreach (DataColumn item in dtSource.Columns)
    {
    //GBK对应的code page是CP936
    arrColWidth[item.Ordinal] = Encoding.GetEncoding(936).GetBytes(item.ColumnName.ToString()).Length;
    }
    for (int i = 0; i < dtSource.Rows.Count; i++)
    {
    for (int j = 0; j < dtSource.Columns.Count; j++)
    {
    int intTemp = Encoding.GetEncoding(936).GetBytes(dtSource.Rows[i][j].ToString()).Length;
    if (intTemp > arrColWidth[j])
    {
    arrColWidth[j] = intTemp;
    }
    }
    }
    #endregion

    int rowIndex = 0;

    foreach (DataRow row in dtSource.Rows)
    {
    #region 新建表,填充表头,填充列头,样式
    if (rowIndex == 65535 || rowIndex == 0)
    {
    if (rowIndex != 0)
    {
    sheet = workbook.CreateSheet();
    }

    #region 表头及样式
    {
    IRow headerRow = sheet.CreateRow(0);
    headerRow.HeightInPoints = 25;
    headerRow.CreateCell(0).SetCellValue(strHeaderText);

    ICellStyle headStyle = workbook.CreateCellStyle();
    headStyle.Alignment = HorizontalAlignment.Center;
    IFont font = workbook.CreateFont();
    font.FontHeightInPoints = 20;
    font.Boldweight = 700;
    headStyle.SetFont(font);

    headerRow.GetCell(0).CellStyle = headStyle;

    sheet.AddMergedRegion(new CellRangeAddress(0, 0, 0, dtSource.Columns.Count - 1));
    }
    #endregion


    #region 列头及样式
    {
    IRow headerRow = sheet.CreateRow(1);
    ICellStyle headStyle = workbook.CreateCellStyle();
    headStyle.Alignment = HorizontalAlignment.Center;
    IFont font = workbook.CreateFont();
    font.FontHeightInPoints = 10;
    font.Boldweight = 700;
    headStyle.SetFont(font);


    foreach (DataColumn column in dtSource.Columns)
    {
    headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);
    headerRow.GetCell(column.Ordinal).CellStyle = headStyle;

    //设置列宽
    sheet.SetColumnWidth(column.Ordinal, (arrColWidth[column.Ordinal] + 1) * 256);

    }
    }
    #endregion

    rowIndex = 2;
    }
    #endregion


    #region 填充内容
    ICellStyle contentStyle = workbook.CreateCellStyle();
    contentStyle.Alignment = HorizontalAlignment.Left;
    IRow dataRow = sheet.CreateRow(rowIndex);
    foreach (DataColumn column in dtSource.Columns)
    {
    ICell newCell = dataRow.CreateCell(column.Ordinal);
    newCell.CellStyle = contentStyle;

    string drValue = row[column].ToString();

    switch (column.DataType.ToString())
    {
    case "System.String"://字符串类型
    newCell.SetCellValue(drValue);
    break;
    case "System.DateTime"://日期类型
    DateTime dateV;
    DateTime.TryParse(drValue, out dateV);
    newCell.SetCellValue(dateV);

    newCell.CellStyle = dateStyle;//格式化显示
    break;
    case "System.Boolean"://布尔型
    bool boolV = false;
    bool.TryParse(drValue, out boolV);
    newCell.SetCellValue(boolV);
    break;
    case "System.Int16"://整型
    case "System.Int32":
    case "System.Int64":
    case "System.Byte":
    int intV = 0;
    int.TryParse(drValue, out intV);
    newCell.SetCellValue(intV);
    break;
    case "System.Decimal"://浮点型
    case "System.Double":
    double doubV = 0;
    double.TryParse(drValue, out doubV);
    newCell.SetCellValue(doubV);
    break;
    case "System.DBNull"://空值处理
    newCell.SetCellValue("");
    break;
    default:
    newCell.SetCellValue("");
    break;
    }

    }
    #endregion

    rowIndex++;
    }


    using (MemoryStream ms = new MemoryStream())
    {
    workbook.Write(ms);
    ms.Flush();
    ms.Position = 0;

    //sheet.Dispose();
    //workbook.Dispose();//一般只用写这一个就OK了,他会遍历并释放所有资源,但当前版本有问题所以只释放sheet
    return ms;
    }

    }


    /// <summary>
    /// 用于Web导出
    /// </summary>
    /// <param name="dtSource">源DataTable</param>
    /// <param name="strHeaderText">表头文本</param>
    /// <param name="strFileName">文件名</param>
    //public static void ExportByWeb(DataTable dtSource, string strHeaderText, string strFileName)
    //{

    // HttpContext curContext = HttpContext.Current;

    // // 设置编码和附件格式
    // curContext.Response.ContentType = "application/vnd.ms-excel";
    // curContext.Response.ContentEncoding = Encoding.UTF8;
    // curContext.Response.Charset = "";
    // curContext.Response.AppendHeader("Content-Disposition",
    // "attachment;filename=" + HttpUtility.UrlEncode(strFileName + ".xls", Encoding.UTF8));

    // curContext.Response.BinaryWrite(Export(dtSource, strHeaderText).GetBuffer());
    // curContext.Response.End();

    //}


    /// <summary>读取excel
    /// 默认第一行为标头
    /// </summary>
    /// <param name="strFileName">excel文档路径</param>
    /// <returns></returns>
    public static DataTable Import(string strFileName)
    {
    DataTable dt = new DataTable();

    HSSFWorkbook hssfworkbook;
    using (FileStream file = new FileStream(strFileName, FileMode.Open, FileAccess.Read))
    {
    hssfworkbook = new HSSFWorkbook(file);
    }
    ISheet sheet = hssfworkbook.GetSheetAt(0);
    System.Collections.IEnumerator rows = sheet.GetRowEnumerator();

    IRow headerRow = sheet.GetRow(0);
    int cellCount = headerRow.LastCellNum;

    for (int j = 0; j < cellCount; j++)
    {
    ICell cell = headerRow.GetCell(j);
    dt.Columns.Add(cell.ToString());
    }

    for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++)
    {
    IRow row = sheet.GetRow(i);
    DataRow dataRow = dt.NewRow();

    for (int j = row.FirstCellNum; j < cellCount; j++)
    {
    if (row.GetCell(j) != null)
    dataRow[j] = row.GetCell(j).ToString();
    }

    dt.Rows.Add(dataRow);
    }
    return dt;
    }

    }
    }

  • 相关阅读:
    前端与算法 leetcode 344. 反转字符串
    JavaScript闭包使用姿势指南
    前端与算法 leetcode 48. 旋转图像
    前端与算法 leetcode 36. 有效的数独
    前端与算法 leetcode 1. 两数之和
    前端与算法 leetcode 283. 移动零
    前端与编译原理 用js去运行js代码 js2run
    前端与算法 leetcode 66. 加一
    前端与算法 leetcode 350. 两个数组的交集 II
    前端与算法 leetcode 26. 删除排序数组中的重复项
  • 原文地址:https://www.cnblogs.com/lockzy/p/11759019.html
Copyright © 2011-2022 走看看