zoukankan      html  css  js  c++  java
  • C#数据导出到Excel

    教授开发了一个nb的导出excel类,很是方便,分享下,留着以后用

    View Code
      1 using System;
      2 using System.Collections.Generic;
      3 using System.Linq;
      4 using System.Text;
      5 using System.IO;
      6 using System.Web;
      7 using NPOI.HSSF.UserModel;
      8 using NPOI.SS.UserModel;
      9 using NPOI.HPSF;
     10 using NPOI.SS.Util;
     11 using NPOI.HSSF.UserModel.Contrib;
     12 using System.Data;
     13 using System.Reflection;
     14 using System.ComponentModel;
     15 
     16 namespace XXXXManage.Common
     17 {
     18     public class MultiSheet
     19     {
     20         public string SheetName { get; set; }
     21         public string Description { get; set; }
     22         public Dictionary<string, int> TopTitle { get; set; }
     23         public Dictionary<string, string> DicTitle { get; set; }
     24         public DataTable Data { get; set; }
     25     }
     26 
     27     public static class ExcelHelper
     28     {
     29         public static DataTable ToDataTable<T>(this IList<T> data)
     30         {
     31             PropertyDescriptorCollection props = TypeDescriptor.GetProperties(typeof(T));
     32             DataTable table = new DataTable();
     33             for (int i = 0; i < props.Count; i++)
     34             {
     35                 PropertyDescriptor prop = props[i];
     36                 table.Columns.Add(prop.Name);
     37             }
     38             object[] values = new object[props.Count];
     39             foreach (T item in data)
     40             {
     41                 for (int i = 0; i < values.Length; i++)
     42                 {
     43                     values[i] = props[i].GetValue(item);
     44                 }
     45                 table.Rows.Add(values);
     46             }
     47             return table;
     48         }
     49 
     50         public static DataTable GetData(Stream stream)
     51         {
     52             return GetData(stream, null);
     53         }
     54         public static DataTable GetData(Stream stream, string sheetName)
     55         {
     56             HSSFWorkbook workbook = new HSSFWorkbook(stream);
     57             Sheet sheet = string.IsNullOrEmpty(sheetName) ? workbook.GetSheetAt(0) : workbook.GetSheet(sheetName);
     58             List<string> cols = new List<string>();
     59             int colIdx = 0;
     60             while (sheet.GetRow(0).GetCell(colIdx) != null)
     61             {
     62                 cols.Add(sheet.GetRow(0).GetCell(colIdx++).StringCellValue.Trim());
     63             }
     64 
     65             DataTable dt = new DataTable();
     66             foreach (string colName in cols)
     67             {
     68                 dt.Columns.Add(colName, typeof(string));
     69             }
     70             int end = sheet.LastRowNum;
     71             int col = dt.Columns.Count;
     72             for (int i = 1; i <= end; i++)
     73             {
     74                 DataRow dr = dt.NewRow();
     75                 for (int j = 0; j < col; j++)
     76                 {
     77                     Cell cell = sheet.GetRow(i).GetCell(j);
     78                     dr[j] = cell == null ? string.Empty : cell.StringCellValue.Trim();
     79                 }
     80                 dt.Rows.Add(dr);
     81             }
     82 
     83             return dt;
     84         }
     85         public static MemoryStream CreateExcel<T>(Dictionary<string, string> dicTitle, List<T> data, string sheetName, string company, string subject)
     86         {
     87             return CreateExcel<T>(dicTitle, data, sheetName, company, subject, string.Empty);
     88         }
     89         public static MemoryStream CreateExcel<T>(Dictionary<string, string> dicTitle, List<T> data, string sheetName, string company, string subject, string description)
     90         {
     91             return CreateExcel<T>(dicTitle, data, sheetName, company, subject, description, null);
     92         }
     93         public static MemoryStream CreateExcel<T>(Dictionary<string, string> dicTitle, List<T> data, string sheetName, string company, string subject, string description, Dictionary<string, int> topTitle)
     94         {
     95             PropertyInfo[] properties = new PropertyInfo[dicTitle.Count];
     96             int idx = 0;
     97             foreach (KeyValuePair<string, string> kv in dicTitle)
     98             {
     99                 PropertyInfo property = typeof(T).GetProperty(kv.Key);
    100                 if (property == null)
    101                 {
    102                     throw new Exception(string.Format("'{0}' not contains propertiy '{1}'", typeof(T).Name, kv.Key));
    103                 }
    104                 properties[idx++] = property;
    105             }
    106 
    107             HSSFWorkbook workbook = new HSSFWorkbook();
    108             DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation();
    109             dsi.Company = company;
    110             workbook.DocumentSummaryInformation = dsi;
    111             SummaryInformation si = PropertySetFactory.CreateSummaryInformation();
    112             si.Subject = subject;
    113             workbook.SummaryInformation = si;
    114 
    115             Sheet sheet = workbook.CreateSheet(sheetName);
    116             int r = 0;
    117             if (topTitle != null)
    118             {
    119                 Row topRow = sheet.CreateRow(r);
    120                 int topIdx = 0;
    121                 foreach (var kv in topTitle)
    122                 {
    123                     topRow.CreateCell(topIdx, CellType.STRING).SetCellValue(kv.Key);
    124                     sheet.AddMergedRegion(new CellRangeAddress(r, r, topIdx, topIdx + kv.Value - 1));
    125                     topIdx = topIdx + kv.Value;
    126                 }
    127 
    128                 r++;
    129             }
    130             if (!string.IsNullOrEmpty(description))
    131             {
    132                 Row descRow = sheet.CreateRow(r);
    133                 descRow.CreateCell(0, CellType.STRING).SetCellValue(description);
    134                 sheet.AddMergedRegion(new CellRangeAddress(r, r, 0, dicTitle.Count - 1));
    135                 r++;
    136             }
    137             Row row = sheet.CreateRow(r);
    138             idx = 0;
    139             foreach (var kv in dicTitle)
    140             {
    141                 row.CreateCell(idx++, CellType.STRING).SetCellValue(kv.Value);
    142             }
    143 
    144             for (int i = 0; i < data.Count; i++)
    145             {
    146                 row = sheet.CreateRow(i + 1 + r);
    147                 for (int j = 0; j < properties.Length; j++)
    148                 {
    149                     row.CreateCell(j, CellType.STRING).SetCellValue(properties[j].GetValue(data[i], null).ToString());
    150                 }
    151             }
    152 
    153             MemoryStream stream = new MemoryStream();
    154             workbook.Write(stream);
    155             return stream;
    156         }
    157         public static MemoryStream CreateExcel(List<MultiSheet> sheets, string company, string subject)
    158         {
    159             #region 有效性验证
    160 
    161             StringBuilder error = new StringBuilder();
    162             if (sheets == null || sheets.Count == 0)
    163             {
    164                 error.Append(string.Format("不包含任何表单数据!"));
    165             }
    166             else
    167             {
    168                 foreach (MultiSheet ms in sheets)
    169                 {
    170                     if (ms.DicTitle == null || ms.DicTitle.Count == 0)
    171                     {
    172                         error.Append(string.Format("“{0}”中不包含任何列;\r\n", ms.SheetName));
    173                     }
    174                     else
    175                     {
    176                         foreach (KeyValuePair<string, string> kv in ms.DicTitle)
    177                         {
    178                             if (!ms.Data.Columns.Contains(kv.Key))
    179                             {
    180                                 error.Append(string.Format("“{0}”中不包含“{1}”列;\r\n", ms.SheetName, kv.Key));
    181                             }
    182                         }
    183                     }
    184                 }
    185             }
    186             if (error.Length > 0)
    187             {
    188                 throw new Exception(error.ToString());
    189             }
    190 
    191             #endregion
    192 
    193             #region Excel文件信息
    194 
    195             HSSFWorkbook workbook = new HSSFWorkbook();
    196             DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation();
    197             dsi.Company = company;
    198             workbook.DocumentSummaryInformation = dsi;
    199             SummaryInformation si = PropertySetFactory.CreateSummaryInformation();
    200             si.Subject = subject;
    201             workbook.SummaryInformation = si;
    202 
    203             #endregion
    204 
    205             #region 写入每个Sheet
    206 
    207             foreach (MultiSheet ms in sheets)
    208             {
    209                 Sheet sheet = workbook.CreateSheet(ms.SheetName);
    210                 int rowIdx = 0;
    211                 int colIdx = 0;
    212                 if (ms.TopTitle != null)
    213                 {
    214                     Row topRow = sheet.CreateRow(rowIdx);
    215                     int topIdx = 0;
    216                     foreach (var kv in ms.TopTitle)
    217                     {
    218                         topRow.CreateCell(topIdx, CellType.STRING).SetCellValue(kv.Key);
    219                         sheet.AddMergedRegion(new CellRangeAddress(rowIdx, rowIdx, topIdx, topIdx + kv.Value - 1));
    220                         topIdx = topIdx + kv.Value;
    221                     }
    222 
    223                     rowIdx++;
    224                 }
    225                 if (!string.IsNullOrEmpty(ms.Description))
    226                 {
    227                     Row descRow = sheet.CreateRow(rowIdx);
    228                     descRow.CreateCell(0, CellType.STRING).SetCellValue(ms.Description);
    229                     sheet.AddMergedRegion(new CellRangeAddress(rowIdx, rowIdx, 0, ms.DicTitle.Count - 1));
    230                     rowIdx++;
    231                 }
    232                 Row row = sheet.CreateRow(rowIdx);
    233 
    234                 foreach (var kv in ms.DicTitle)
    235                 {
    236                     row.CreateCell(colIdx++, CellType.STRING).SetCellValue(kv.Value);
    237                 }
    238 
    239                 for (int i = 0; i < ms.Data.Rows.Count; i++)
    240                 {
    241                     row = sheet.CreateRow(i + 1 + rowIdx);
    242                     colIdx = 0;
    243                     foreach (string colName in ms.DicTitle.Keys)
    244                     {
    245                         string value = ms.Data.Rows[i][colName] == null ? string.Empty : ms.Data.Rows[i][colName].ToString();
    246                         row.CreateCell(colIdx++, CellType.STRING).SetCellValue(value);
    247                     }
    248                 }
    249             }
    250 
    251             #endregion
    252 
    253             MemoryStream stream = new MemoryStream();
    254             workbook.Write(stream);
    255             return stream;
    256         }
    257     }
    258 }


    调用方式

    View Code
     1 List<MultiSheet> sheets = new List<MultiSheet> { 
     2                 new MultiSheet{
     3                     SheetName = "车款关联信息",
     4                     Data = new List<CarStyleRelationViewModels>().ToDataTable<CarStyleRelationViewModels>(),
     5                     Description = null,
     6                     TopTitle = null,
     7                     DicTitle = new Dictionary<string,string>{
     8                         {"CarStyleName","本系统车款"},
     9                         {"RME_CarModelName","RME车款"}
    10                     }
    11                 },
    12                 new MultiSheet{
    13                     SheetName = "本系统车系车型车款对应表",
    14                     Data = dsaCarStyle.ToList().ToDataTable<DSACarStyleViewModel>(),
    15                     Description = null,
    16                     TopTitle = null,
    17                     DicTitle = new Dictionary<string,string>{
    18                         {"CarSeries","车系"},
    19                         {"CarType","车型"},
    20                         {"CarStyle","车款"}
    21                     }
    22                 }, 
    23                 new MultiSheet{
    24                     SheetName = "RME车型车款对应表",
    25                     Data = rmeCarModel.ToList().ToDataTable<DictionaryViewModel>(),
    26                     Description = null,
    27                     TopTitle = null,
    28                     DicTitle = new Dictionary<string,string>{
    29                         {"key","RME车型"},
    30                         {"value","RME车款"}
    31                     }
    32                 }            
    33             };
    34 
    35 ExcelHelper.CreateExcel(sheets, "XXX", "车款关联信息").GetBuffer()
  • 相关阅读:
    docker使用常用命令:启动/重启/关闭docker
    golang 中内存模型
    【转】Linux fork操作之后发生了什么?又会共享什么呢?
    go检查channel是否关闭
    golang select case 用法
    【转】理解字节序 大端字节序和小端字节序
    【转】3种TCP连接异常的情况。
    react-window 多条列表数据加载(虚拟滚动)
    ts 中 interface 与 class 的区别
    js new一个对象的过程,实现一个简单的new方法
  • 原文地址:https://www.cnblogs.com/futao/p/2607816.html
Copyright © 2011-2022 走看看