ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

自定义EXCEL导出格式

2019-11-21 10:53:53  阅读:196  来源: 互联网

标签:自定义 int EXCEL easyDataColumn 导出 var dt List public


  在项目中经常会用到这种情况:前台通过easyui自定义页表格展示,然后再通过excel导出到本地。

  项目中用的最多的就是多级表头的情况,在这里markI一下。

  1、自定义列对象

 1 public class EasyUIDataColumn
 2 {
 3 
 4 public string field { get; set; }
 5 
 6 private int _colspan = 1;
 7 private int _rowspan = 1;
 8 
 9 
10 public string align = "left";
11 public int colspan
12 {
13 get { return _colspan; }
14 set { _colspan = value; }
15 }
16 public int rowspan
17 {
18 get { return _rowspan; }
19 set { _rowspan = value; }
20 }
21 
22 public string title;
23 private int _width;
24 
25 public int width
26 {
27 get
28 {
29 if (_width == 0)
30 {
31 if (DicEasyUIColumnWidth.ContainsKey(title)) { return DicEasyUIColumnWidth[title]; }
32 return 20 * _colspan * (Encoding.Default.GetBytes(title).Length / 2);
33 }
34 else
35 {
36 return _width;
37 }
38 }
39 set
40 {
41 _width = value;
42 }
43 
44 }
45 
46 
47 public static readonly char EasyUIColumnSplit = '_';
48 
49 }
50 }

  2.通过从数据库中得到的DataTable数据生成对应的List<List<EasyUIDataColumn>>对象

 1    public List<List<EasyUIDataColumn>> GetEasyUIDataColumnList(string testID, DataTable dt, int frozenColumns = -1, bool isGetFrozenColumns = false)
 2         {
 3             List<List<EasyUIDataColumn>> arrEasyDataColumnList = new List<List<EasyUIDataColumn>>();
 4             List<EasyUIDataColumn> EasyDataColumnList = new List<EasyUIDataColumn>();
 5             List<EasyUIDataColumn> TitleColumnList = new List<EasyUIDataColumn>();
 6             for (int i = 0; i < dt.Columns.Count; i++)
 7             {
 8                 EasyUIDataColumn easyDataColumn = new EasyUIDataColumn();
 9                 easyDataColumn.width = 100;
10                 if (isGetFrozenColumns)
11                 {
12                     if (i <= frozenColumns)
13                     {
14                         EasyUIDataColumn titleColumn = new EasyUIDataColumn();
15                         titleColumn.rowspan = 2;
16                         titleColumn.title = dt.Columns[i].ColumnName;
17                         titleColumn.field = dt.Columns[i].ColumnName;
18                         TitleColumnList.Add(titleColumn);
19                         continue;
20                     }
21                 }
22                 else
23                 {
24                     if (i <= frozenColumns)
25                     {
26                         continue;
27                     }
28                 }
29 
30                 if (i == 2||i==6)
31                 {
32                     EasyUIDataColumn titleColumn = new EasyUIDataColumn();
33                     string[] columnName = dt.Columns[i].ColumnName.Split(EasyUIDataColumn.EasyUIColumnSplit);
34                     titleColumn.colspan = 4;
35                     titleColumn.title = columnName[0];
36                     titleColumn.field = "";
37                     TitleColumnList.Add(titleColumn);
38                 }
39 
40 
41                 if (dt.Columns[i].ColumnName.IndexOf(EasyUIDataColumn.EasyUIColumnSplit) > -1)
42                 {
43                     string[] columnName = dt.Columns[i].ColumnName.Split(EasyUIDataColumn.EasyUIColumnSplit);
44                     easyDataColumn.title = columnName[1];
45                     easyDataColumn.field = dt.Columns[i].ColumnName;
46                     easyDataColumn.align = "center";
47                 }
48                 else
49                 {
50                     easyDataColumn.title = dt.Columns[i].ColumnName;
51                     easyDataColumn.field = dt.Columns[i].ColumnName;
52                     easyDataColumn.align = "center";
53                 }
54                 EasyDataColumnList.Add(easyDataColumn);
55             }
56             arrEasyDataColumnList.Add(TitleColumnList);
57             arrEasyDataColumnList.Add(EasyDataColumnList);
58             return arrEasyDataColumnList;
59         }

  3.根据自定义的表格式生成excel

  

  1 /// <summary>
  2         ///     将DataTable数据导出到Excel文件中(xlsx),自定义列头
  3         /// </summary>
  4         /// <param name="dt"></param>
  5         /// <param name="file"></param>
  6         /// <param name="columnList">列集合</param>
  7         /// <param name="frozenClounms">冻结列 或者 列表开始rowspan=2的列数 </param>
  8         public void ExportDataTableToExcelForXLSXByCustomColumn(DataTable dt, string file,
  9             List<List<EasyUIDataColumn>> columnList, int frozenClounms)
 10         {
 11             var xssfworkbook = new XSSFWorkbook();
 12             ICellStyle styleColName = xssfworkbook.CreateCellStyle();
 13             styleColName.Alignment = HorizontalAlignment.Center;
 14             styleColName.VerticalAlignment = VerticalAlignment.Center;
 15             var sheet = xssfworkbook.CreateSheet(dt.TableName); //sheet名
 16             var firstrow = 0;
 17             var lastrow = 0;
 18             var firstcol = 0;
 19             var lastcol = 0;
 20             //表头   
 21             for (var i = 0; i < columnList.Count; i++)
 22             {
 23                 var sumColSpan = 0;
 24 
 25                 for (var j = 0; j < columnList[i].Count; j++)
 26                 {
 27                     int tempRowSpan = columnList[i][j].rowspan == 0 ? 1 : columnList[i][j].rowspan;
 28                     firstrow = i;
 29                     lastrow = i + tempRowSpan - 1;
 30 
 31                     int tempColSpan = columnList[i][j].colspan == 0 ? 1 : columnList[i][j].colspan;
 32                     firstcol = j + sumColSpan;
 33                     lastcol = j + sumColSpan + tempColSpan - 1;
 34                     sumColSpan += (tempColSpan - 1);
 35 
 36                     MergeColumn(sheet, firstrow, lastrow, firstcol, lastcol, columnList[i][j].title, styleColName, frozenClounms);
 37                 }
 38             }
 39         
 40             sheet.SetColumnWidth(0, 15 * 256);
 41             //写入数据   
 42             for (var i = 0; i < dt.Rows.Count; i++)
 43             {
 44                 var row1 = sheet.CreateRow(i + 2);
 45                 for (var j = 0; j < dt.Columns.Count; j++)
 46                 {
 47                     var cell = row1.CreateCell(j);
 48                     if (IsNumeric(dt.Rows[i][j].ToString()))
 49                     {
 50                         cell.SetCellType(CellType.Numeric);
 51                         cell.SetCellValue(Convert.ToDouble(dt.Rows[i][j]));
 52                     }
 53                     else
 54                     {
 55                         cell.SetCellValue(dt.Rows[i][j].ToString());
 56                     }
 57                 }
 58             }
 59 
 60             //转为字节数组   
 61             var stream = new MemoryStream();
 62             xssfworkbook.Write(stream);
 63             var buf = stream.ToArray();
 64 
 65             //保存为Excel文件   
 66             using (var fs = new FileStream(file, FileMode.Create, FileAccess.Write))
 67             {
 68                 fs.Write(buf, 0, buf.Length);
 69                 fs.Close();
 70             }
 71         }
 72 
 73    private void MergeColumn(ISheet sheet, int firstrow, int lastrow, int firstcol, int lastcol, string value, ICellStyle cellStyle, int frozenClounms)
 74         {
 75             //第二行,全部往前进frozenClounms个列
 76             if (firstrow == 1)
 77             {
 78                 firstcol += frozenClounms;
 79                 lastcol += frozenClounms;
 80             }
 81             for (var i = firstrow; i <= lastrow; i++)
 82             {
 83                 for (var j = firstcol; j <= lastcol; j++)
 84                 {
 85                     if (j == firstcol)
 86                     {
 87 
 88                         LoadCell(sheet, i, j, cellStyle).SetCellValue(value);
 89                     }
 90                     else
 91                     {
 92                         LoadCell(sheet, i, j).SetCellValue("");
 93                     }
 94                 }
 95             }
 96             sheet.AddMergedRegion(new CellRangeAddress(firstrow, lastrow, firstcol, lastcol)); //合并单元格
 97         }
 98         private ICell LoadCell(ISheet sheet1, int rowIndex, int cellIndex, ICellStyle cellStyle = null)
 99         {
100             var row = sheet1.GetRow(rowIndex) ?? sheet1.CreateRow(rowIndex);
101 
102             var cell = row.GetCell(cellIndex);
103             if (cell == null)
104             {
105                 cell = sheet1.GetRow(rowIndex).CreateCell(cellIndex);
106             }
107             cell.CellStyle = cellStyle;
108             return cell;
109         }
110    

 

标签:自定义,int,EXCEL,easyDataColumn,导出,var,dt,List,public
来源: https://www.cnblogs.com/hobby0524/p/11904155.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有