Asp.net导出Excel续章(自定义合并单元格,非Office组件)

结合上次写的导出Excel方法,这次上头要求我将列头进行一下合并

以前的效果:

改进后的效果:

在上篇文章中写到了Excel的导出方法,这次为了避免在生产环境中使用Office组件,服务器各种权限配置的麻烦,这次就不使用Office组件来生成Excel了。

上篇文章:Asp.net导出Excel(HTML输出)

关键代码如下图:

说道这里,其实主要思路已经很明显了。

在数据绑定结束后,重新绘制表头替换掉原来的表头就行了。

TableCell自定义表头的时候是table标签的,很方便。

另外发现了一个小技巧:

我使用Office Excel 2013 绘画好表头,然后直接复制,在Macromedia Dreamweaver 8的设计面板粘贴就可以贴上去了,然后转到代码页面就可以快速得到table代码。

最后贴上这几句代码:

1 gvw.HeaderRow.Cells.Clear();
2 TableCell tc = new TableCell();
3 //重新绘制表头
4 tc.Text = "<tr> ...... </tr>";
5 gvw.HeaderRow.Cells.Add(tc);

重绘表头

另外,看见博友推荐我使用NPOI.HSSF.Util组件,听说很操作很方便。这里也推荐啦!

//- 创建 Excel
   HSSFWorkbook hssfworkbook = new HSSFWorkbook();
   //- 创建 Sheet
   var sheet = hssfworkbook.CreateSheet("淘汰选项报表");

   //- Sheet 里的每一个 Row
   NPOI.SS.UserModel.Row row;
   //- 创建一个“绘画器”,这个绘画器用于所有的图片写入。
   //- 请注意,是所有的图片,不可一张图片创建一个!否则将导致没有图片
   var patriarch = sheet.CreateDrawingPatriarch();

   //- 默认单元格的样式以及字体,是“Excel 级”的,如果对其进行设置,将导致所有的单元格都是这些字体以及样式
   //- 创建一个新的字体以及样式,可以确保这些“单元格”独立的字体与样式。
   //- 这里是创建一个标题的样式
   var cellFont = hssfworkbook.CreateFont();
   var cellStyle = hssfworkbook.CreateCellStyle();

   //- 加粗,白色前景色
   cellFont.Boldweight = (short)NPOI.SS.UserModel.FontBoldWeight.BOLD;
   cellFont.Color = NPOI.HSSF.Util.HSSFColor.WHITE.index;

   //- 很费解 FillForegroundColor 这个属性,我设置了是背景色,可从字义上来说,这个似乎叫“前景色”?
   //- 更令人无语的是,还有 FillBackgroundColor 属性。真不知道做什么的。
   cellStyle.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.GREY_40_PERCENT.index;
   //- 这个是填充的模式,可以是网格、花式等。如果需要填充单色,请使用:SOLID_FOREGROUND
   cellStyle.FillPattern = NPOI.SS.UserModel.FillPatternType.SOLID_FOREGROUND;
   //- 设置这个样式的字体,如果没有设置,将与所有单元格拥有共同字体!
   cellStyle.SetFont(cellFont);

   for(int i = 0 ; i <= gridView1.RowCount ; i++)
   {//- 遍历行 这是 GridControl 控件的 GridView,i <= gridView1.RowCount的原因是首行我们设置为 标题行

       row = sheet.CreateRow(i);
       foreach(GridColumn column in gridView1.Columns)
       {
           //- 确保只需要显示的列
           if(column.Visible)
           {
               //- 创建当前 row 指定列索引的 cell
               NPOI.SS.UserModel.Cell cell = row.CreateCell(column.VisibleIndex);
               //- 标题行
               if(i == 0)
               {
                   row.HeightInPoints = 50f;           //- 设置行高  row.Height 需要 乘以 20
                   cell.SetCellValue(column.Caption); ; //-设置单元格内容
                   cell.CellStyle = cellStyle;         //- 设置单元格的独立样式
               }
               else
               {
                   row.HeightInPoints = 100f;          // 设置行高  row.Height 需要 乘以 20
                   object value = gridView1.GetRowCellValue(i - 1, column);

                   //- 如果是一个图片
                   if(value != null && value.GetType() == typeof(byte[]))
                   {
                       sheet.SetColumnWidth(column.VisibleIndex, 50 * 256);//- 设置列宽,需要 乘以 256

                       //- 插入图片到 Excel,并返回一个图片的标识
                       var pictureIdx = hssfworkbook.AddPicture((byte[])value, NPOI.SS.UserModel.PictureType.JPEG);

                       //- 创建图片的位置
                       var anchor = new HSSFClientAnchor(
                           0, 0,                               //- 上左 到 上右 的位置,是基于下面的行列位置
                           0, 0,                               //- 下左 到 下右 的位置,是基于下面的行列位置
                           column.VisibleIndex, i,
                           column.VisibleIndex + 1, i + 1);
                       //- 图片输出的位置这么计算的:
                       //- 假设我们要将图片放置于第 5(E) 列的第 2 行
                       //- 对应索引为是 4 : 1 (默认位置)
                       //- 放置的位置就等于(默认位置)到(默认位置各自加上一行、一列)

                       patriarch.CreatePicture(anchor, pictureIdx);//- 使用绘画器绘画图片
                   }
                   else
                   {
                       cell.SetCellValue(value.ToStringOrEmpty());
                   }
               }
               //- 居中
               cell.CellStyle.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.CENTER;
               cell.CellStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.CENTER;

               //- 细边缘
               cell.CellStyle.BorderBottom = NPOI.SS.UserModel.CellBorderType.THIN;
               cell.CellStyle.BorderLeft = NPOI.SS.UserModel.CellBorderType.THIN;
               cell.CellStyle.BorderRight = NPOI.SS.UserModel.CellBorderType.THIN;
               cell.CellStyle.BorderTop = NPOI.SS.UserModel.CellBorderType.THIN;

               cell.CellStyle.BottomBorderColor = NPOI.HSSF.Util.HSSFColor.BLACK.index;
               cell.CellStyle.LeftBorderColor = NPOI.HSSF.Util.HSSFColor.BLACK.index;
               cell.CellStyle.RightBorderColor = NPOI.HSSF.Util.HSSFColor.BLACK.index;
               cell.CellStyle.TopBorderColor = NPOI.HSSF.Util.HSSFColor.BLACK.index;
           }
       }

   }

   FileStream file = new FileStream(fileName, FileMode.Create);
   hssfworkbook.Write(file);//- 保存
   file.Close();

NPOI.HSSF.Util组件使用方法(转载)

Asp.net导出Excel续章(自定义合并单元格,非Office组件)

时间: 2024-10-29 05:55:20

Asp.net导出Excel续章(自定义合并单元格,非Office组件)的相关文章

DevExpress XtraGrid网格控件示例六:自定义合并单元格

假设 "Order Date" 列中包含日期/时间值.如果视图的GridOptionsView.AllowCellMerge选项设置为true,若相邻两个单元格值是日期/时间值的话,这两个相邻单元格便会合并.下面的代码介绍了如何合并例单元格的日期部分,要覆盖默认的单元格合并机制,需要处理一下GridView.CellMerge事件. C# using DevExpress.XtraGrid.Views.Grid; // ... private void gridView1_CellMe

php 数据导出到excel 2种带有合并单元格的导出

具体业务层面 可能会有所不同.以下两种方式涉及的合并单元格地方有所不同,不过基本思路是一致的. 第一种是非插件版本.可能更容易理解点,基本思路就是 组装table 然后 读取 输出到excel上.缺点是要设置样式不太好设置. 第二种是利用插件  PHPExcel   有点是可以对输出格式做各种设置.缺点是初次接触这个插件的同学,并且对表格合并不熟悉的同学,可能要花点时间理解 另外注意excel对数字过长会处理成你不想要的数据,记得对该数据格式化成字符串 貌似就可以解决.以前遇到过 /** * *

Excel宏开发之合并单元格

合并单元格 Sub 宏1() ' ' 宏1 宏 ' ' 快捷键: Ctrl+q ' Application.Goto Reference:="宏1" Application.VBE.MainWindow.Visible = True Application.DisplayAlerts = False For i = [A65536].End(3).Row To 2 Step -1 If Cells(i - 1, 1) = Cells(i, 1) Then Cells(i - 1, 1)

在Asp.Net MVC中使用NPOI插件实现对Excel的操作(导入,导出,合并单元格,设置样式,输入公式)

前言 NPOI 是 POI 项目的.NET版本,它不使用 Office COM 组件,不需要安装 Microsoft Office,目前支持 Office 2003 和 2007 版本. 1.整个Excel表格叫做工作表:WorkBook(工作薄),包含的叫页(工作表):Sheet:行:Row:单元格Cell. 2.NPOI是POI的C#版本,NPOI的行和列的index都是从0开始 3.POI读取Excel有两种格式一个是HSSF,另一个是XSSF. HSSF和XSSF的区别如下: HSSF

ASP.NET导出Excel文件

第一种最常见,并且最简单的方式,直接把GridView导出,导出格式为文本表格形式. protected void btnSaveExcel_Click(object sender, EventArgs e) { string FileName = "xxx"; System.IO.StringWriter objSW = new System.IO.StringWriter(); System.Web.UI.HtmlTextWriter objHTW = new System.Web

asp.net 导出excel 中文乱码解决方法 (转)

用我转载的上一篇文章 Asp.net中把DataTable或DataGrid导出为Excel 导出的文档,中文有乱码现象,其实要解决中文乱码很简单,设置一下字符集.如下: // 设置编码和附件格式 curContext.Response.ContentType = "application/vnd.ms-excel"; curContext.Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312&

Asp.net导出Excel乱码的解决方法

通过跟踪Asp.net服务器代码,没有乱码,然而导出Excel到浏览器后,打开时出现乱码. 解决方法是添加编码格式的前缀字节码:Response.BinaryWrite(System.Text.Encoding.Unicode.GetPreamble()); ? 1 2 3 4 5 6 7 8 9 10 11 12 13 Response.Clear(); Response.AddHeader("content-disposition","attachment;filenam

带复杂表头合并单元格的HtmlTable转换成DataTable并导出Excel(转)

步骤: 一.前台JS取HtmlTable数据,根据设定的分隔符把数据拼接起来 <!--导出Excel--> <script type="text/javascript"> //导出Excel function exportExcel() { var data = ""; $("#divRptTable").find("table").find("tr").each(function

【转】C# DataTable 导出 Excel 进阶 多行表头、合并单元格、中文文件名乱码

本文原创地址:http://blog.csdn.net/ranbolwb/article/details/8083983 ,转载请保留本行. 本例子是上一篇 DataTable 导出 Excel 的进阶,除了上一篇提到的处理乱码问题,本例还添加了处理多行表头.合并单元格的功能及处理中文文件名乱码问题,应该可以满足日常开发的需要了. 废话不多说了,直接上代码: [C#] 可以写单独类 1 using System; 2 using System.Collections.Generic; 3 usi