NPOI导出Excel - 自动适应中文宽度

转载 2016年01月05日 11:30:31

NPOI导出Excel - 自动适应中文宽度

    /// <summary>
    /// 创建工作簿
    /// </summary>
    /// <param name="fileName">下载文件名</param>
    /// <param name="dt">数据源</param>
    public static void CreateSheet(string fileName, DataTable dt)
    {
      HSSFWorkbook workbook = new HSSFWorkbook();
      MemoryStream ms = new MemoryStream();

      //创建一个名称为Payment的工作表
      ISheet paymentSheet = workbook.CreateSheet("Payment");

      //数据源
      DataTable tbPayment = dt;

      //头部标题
      IRow paymentHeaderRow = paymentSheet.CreateRow(0);

      //循环添加标题
      foreach (DataColumn column in tbPayment.Columns)
        paymentHeaderRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);

      // 内容
      int paymentRowIndex = 1;

      foreach (DataRow row in tbPayment.Rows)
      {
        IRow newRow = paymentSheet.CreateRow(paymentRowIndex);

        //循环添加列的对应内容
        foreach (DataColumn column in tbPayment.Columns)
        {
          newRow.CreateCell(column.Ordinal).SetCellValue(row[column].ToString());
        }

        paymentRowIndex++;
      }

      //列宽自适应,只对英文和数字有效
      for (int i = 0; i <= dt.Rows.Count; i++)
      {
        paymentSheet.AutoSizeColumn(i);
      }
      //获取当前列的宽度,然后对比本列的长度,取最大值
      for (int columnNum = 0; columnNum <= dt.Rows.Count; columnNum++)
      {
        int columnWidth = paymentSheet.GetColumnWidth(columnNum) / 256;
        for (int rowNum = 1; rowNum <= paymentSheet.LastRowNum; rowNum++)
        {
          IRow currentRow;
          //当前行未被使用过
          if (paymentSheet.GetRow(rowNum) == null)
          {
            currentRow = paymentSheet.CreateRow(rowNum);
          }
          else
          {
            currentRow = paymentSheet.GetRow(rowNum);
          }

          if (currentRow.GetCell(columnNum) != null)
          {
            ICell currentCell = currentRow.GetCell(columnNum);
            int length = Encoding.Default.GetBytes(currentCell.ToString()).Length;
            if (columnWidth < length)
            {
              columnWidth = length;
            }
          }
        }
        paymentSheet.SetColumnWidth(columnNum, columnWidth * 256);
      }

      //将表内容写入流 通知浏览器下载
      workbook.Write(ms);
      System.Web.HttpContext.Current.Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}.xls", fileName));
      System.Web.HttpContext.Current.Response.BinaryWrite(ms.ToArray()); //进行二进制流下在

      workbook = null;
      ms.Close();
      ms.Dispose();
    }

    /// <summary>
    /// 虚拟 DataTable内容
    /// </summary>
    /// <returns></returns>
    public static DataTable CreatTable()
    {
      //创建DataTable 将数据库中没有的数据放到这个DT中
      DataTable datatable = new DataTable();
      datatable.Columns.Add("列1", typeof(string));
      datatable.Columns.Add("列2", typeof(string));
      datatable.Columns.Add("列3", typeof(string));
      //创建DatatTable 结束---------------------------

      //开始给临时datatable赋值
      for (int i = 0; i < 10; i++)
      {
        DataRow row = datatable.NewRow();
        row["列1"] = "列111111111111111111111111111111";
        row["列2"] = "列222222222222222222222222222222222222222";
        row["列3"] = "列3333333322222222222211111111111111111111111113";
        datatable.Rows.Add(row);
      }
      return datatable;
    }




NPOI2.2.0.0实例详解(三)—设置EXCEL列宽、行高与合并单元格

设置EXCEL列宽、行高与合并单元格
  • xxs77ch
  • xxs77ch
  • 2015年12月08日 11:04
  • 11077

NPOI 1.2教程 - 2.2.7 设置单元格的宽度和高度

在Excel中,单元格的宽度其实就是列的宽度,因为Excel假设这一列的单元格的宽度肯定一致。所以要设置单元格的宽度,我们就得从列的宽度下手,HSSFSheet有个方法叫SetColumnWidth,...
  • ljj_9
  • ljj_9
  • 2015年12月25日 10:27
  • 3694

npoi导出的excel中设置列宽

npoi中,sheet.SetColumnWidth(int col, int width),这个width是按一个字符数 * 256的长度来算的,这样的话excel实际宽度就是自己想设定的值。 当我...
  • tzz8080
  • tzz8080
  • 2016年07月12日 22:53
  • 2264

NPOI中实现列宽精确控制

NPOI生成Excel文件时,设置列宽只有一函数sheet.SetColumnWidth(),该函数有两个参数,第一个是行索引,第二个是行列宽。但是在实际使用过程中,设置的行列宽与产生的Excel文件...
  • echoshinian100
  • echoshinian100
  • 2015年07月05日 18:00
  • 2450

C# NPOI AutoSizeColumn失效解决方案

NPOI导出EXCEL在处理中文时,需要表格列宽自动调整宽度时遇到问题,NPOI的自带函数AutoSizeColumn(int 列号)只能支持英文和数字,那就先用AutoSizeColumn(int列...
  • wandongcheng
  • wandongcheng
  • 2014年12月03日 14:30
  • 4140

如何在NPOI中实现宽度自适应和高度自适应

由于系统需要在wa
  • echoshinian100
  • echoshinian100
  • 2014年08月13日 17:47
  • 9848

NPOI自适应宽度不支持中文解决方案

最近一个项目中涉及报表导出为excel功能需求。我最开始使用微软自身的excel COM组件调用的方式进行导出,发现当需要导出的内容增大到一定程度时,速度十分缓慢,而且调用COM组件需要在服务器端安装...
  • jerry_cool
  • jerry_cool
  • 2011年11月22日 14:03
  • 11307

poi设置自适应列宽的三种方法

sheet.autoSizeColumn(i); (版本不能太老) sheet.autoSizeColumn(i, true);(合并的单元格使用) sheet.setColumnWidth(i,...
  • fenglingfeixian
  • fenglingfeixian
  • 2017年03月22日 11:13
  • 6768

NPOI 单元格格式设置

////自动换行                ////自动换行翻译成英文其实就是Wrap的意思,所以这里我们应该用WrapText属性,这是一个布尔属性                //sty...
  • lcnmdfx
  • lcnmdfx
  • 2014年07月24日 14:18
  • 18307

npoi自适应行高和列宽

由于系统需要在网页上导 出Excel文件,最近花了一段时间去学习NPOI插件。通过NPOI插件在服务端来生成Excel文件流并下载到本地。NPOI实际上和Excel一毛 钱关系都没有,它只是完全破译了...
  • wsqplsh
  • wsqplsh
  • 2016年07月22日 18:37
  • 1143
收藏助手
不良信息举报
您举报文章:NPOI导出Excel - 自动适应中文宽度
举报原因:
原因补充:

(最多只允许输入30个字)