zoukankan      html  css  js  c++  java
  • 使用NPOI实现excel的导入导出 itprobie

    NPOI2可以对excle2003和excle2007进行导入导出的操作

      1 using System;
      2 using System.Collections.Generic;
      3 using System.Linq;
      4 using System.Web;
      5 
      6 using System.IO;
      7 using System.Reflection;
      8 using System.Collections;
      9 using System.Data;
     10 using NPOI.SS.UserModel;
     11 
     12 /// <summary>
     13 /// Summary description for OfficeHelper
     14 /// </summary>
     15 public class OfficeHelper
     16 {
     17     DownHelper downHelper = null;
     18     public OfficeHelper()
     19     {
     20         downHelper = new DownHelper();
     21     }
     22 
     23 
     24     /// <summary>
     25     /// 从excle导入到数据集,excle中的工作表对应dataset中的table,工作表名和列名分别对应table中的表名和列名
     26     /// </summary>
     27     /// <param name="path"></param>
     28     /// <returns></returns>
     29     public DataSet ExcelToDataSet(string path)
     30     {
     31         DataSet ds = new DataSet();
     32         IWorkbook wb = WorkbookFactory.Create(path);
     33         for (int sheetIndex = 0; sheetIndex < wb.Count; sheetIndex++)
     34         {
     35             ISheet sheet = wb.GetSheetAt(sheetIndex);
     36             DataTable dt = new DataTable(sheet.SheetName);
     37 
     38             //添加列
     39             int columnCount = sheet.GetRow(0).PhysicalNumberOfCells;
     40             for (int i = 0; i < columnCount; i++)
     41                 dt.Columns.Add(sheet.GetRow(0).GetCell(i).StringCellValue);
     42 
     43             //添加行,从索引为1的行开始
     44             int rowsCount = sheet.PhysicalNumberOfRows;
     45             for (int i = 1; i < rowsCount; i++)
     46             {
     47                 DataRow dr = dt.NewRow();
     48                 for (int j = 0; j < columnCount; j++)
     49                     dr.SetField(j, sheet.GetRow(i).GetCell(j).StringCellValue);
     50                 dt.Rows.Add(dr);
     51             }
     52             ds.Tables.Add(dt);
     53         }
     54         return ds;
     55     }
     56 
     57     /// <summary>
     58     /// 将集合中的数据导入到excle中,不同的集合对应excel中的不同的工作表
     59     /// </summary>
     60     /// <param name="lists">不同对象的集合,集合中的对象可以通过设置特性来关联列名</param>
     61     /// <param name="fileName">保存的文件名,后缀名为.xls或.xlsx</param>
     62     public void ListToExcel(IList[] lists, string fileName)
     63     {
     64         DataSetToExcel(ConvertToDataSet(lists), fileName);
     65     }
     66 
     67 
     68     /// <summary>
     69     /// 将数据集中的数据导入到excel中,多个table对应的导入到excel对应多个工作表
     70     /// </summary>
     71     /// <param name="ds">要导出到excle中的数据集,数据集中表名和字段名在excel中对应工作表名和标题名称</param>
     72     /// <param name="fileName">保存的文件名,后缀名为.xls或.xlsx</param>
     73     public void DataSetToExcel(DataSet ds, string fileName)
     74     {
     75         if (ds != null)
     76         {
     77             IWorkbook wb = CreateSheet(fileName);
     78             foreach (DataTable dt in ds.Tables)
     79             {
     80                 ImportToWorkbook(dt, ref wb);
     81             }
     82 
     83             downHelper.DownloadByOutputStreamBlock(
     84                 new MemoryStream(ToByte(wb)), fileName);
     85         }
     86     }
     87 
     88     /// <summary>
     89     /// 将数据导入到excel中
     90     /// </summary>
     91     /// <param name="dt">要导出到excle中的数据表,表名和字段名在excel中对应工作表名和标题名称</param>
     92     /// <param name="fileName">保存的文件名,后缀名为.xls或.xlsx</param>
     93     public void DataTableToExcel(DataTable dt, string fileName)
     94     {
     95         IWorkbook wb = CreateSheet(fileName);
     96         ImportToWorkbook(dt, ref wb);
     97         downHelper.DownloadByOutputStreamBlock(
     98             new MemoryStream(ToByte(wb)), fileName);
     99     }
    100 
    101 
    102     private DataSet ConvertToDataSet(IList[] lists)
    103     {
    104         DataSet ds = new DataSet();
    105 
    106         foreach (IList list in lists)
    107         {
    108             if (list != null && list.Count > 0)
    109             {
    110                 string tableName = list[0].GetType().Name;
    111                 object[] classInfos = list[0].GetType().
    112                     GetCustomAttributes(typeof(EntityMappingAttribute), true);
    113 
    114                 if (classInfos.Length > 0)
    115                     tableName = ((EntityMappingAttribute)classInfos[0]).Name;
    116 
    117                 DataTable dt = new DataTable(tableName);
    118                 object obj = list[0];
    119                 PropertyInfo[] propertyInfos = obj.GetType().
    120                     GetProperties(BindingFlags.Public | BindingFlags.Instance);
    121 
    122                 foreach (PropertyInfo propertyInfo in propertyInfos)
    123                 {
    124                     object[] infos = propertyInfo.
    125                         GetCustomAttributes(typeof(EntityMappingAttribute), true);
    126                     if (infos.Length > 0)
    127                         dt.Columns.Add(((EntityMappingAttribute)infos[0]).Name);
    128                     else
    129                         dt.Columns.Add(propertyInfo.Name);
    130                 }
    131 
    132                 //添加数据
    133                 for (int i = 0; i < list.Count; i++)
    134                 {
    135                     DataRow dr = dt.NewRow();
    136                     object objTemp = list[i];
    137                     PropertyInfo[] propertyInfosTemp = objTemp.GetType().
    138                         GetProperties(BindingFlags.Public | BindingFlags.Instance);
    139                     for (int j = 0; j < propertyInfosTemp.Count(); j++)
    140                     {
    141                         dr.SetField(j, propertyInfosTemp[j].GetValue(obj, null));
    142                     }
    143                     dt.Rows.Add(dr);
    144                 }
    145 
    146                 ds.Tables.Add(dt);
    147             }
    148             else
    149             {
    150                 ds.Tables.Add(new DataTable(list.GetType().Name));
    151             }
    152         }
    153 
    154         return ds;
    155     }
    156 
    157 
    158     private void ImportToWorkbook(DataTable dt, ref IWorkbook wb)
    159     {
    160         string sheetName = dt.TableName ?? "Sheet1";
    161         //创建工作表
    162         ISheet sheet = wb.CreateSheet(sheetName);
    163         //添加标题
    164         IRow titleRow = sheet.CreateRow(0);
    165         SetRow(titleRow,
    166             GetCloumnNames(dt),
    167             GetCellStyle(sheet.Workbook, FontBoldWeight.Bold));
    168 
    169         //添加数据行
    170         for (int i = 0; i < dt.Rows.Count; i++)
    171         {
    172             IRow dataRow = sheet.CreateRow(i + 1);
    173             SetRow(
    174                 dataRow,
    175                 GetRowValues(dt.Rows[i]),
    176                 GetCellStyle(sheet.Workbook));
    177         }
    178 
    179         //设置表格自适应宽度
    180         AutoSizeColumn(sheet);
    181     }
    182 
    183     private byte[] ToByte(IWorkbook wb)
    184     {
    185         using (MemoryStream ms = new MemoryStream())
    186         {
    187             //XSSFWorkbook即读取.xlsx文件返回的MemoryStream是关闭
    188             //但是可以ToArray(),这是NPOI的bug
    189             wb.Write(ms);
    190             return ms.ToArray();
    191         }
    192     }
    193 
    194     private IWorkbook CreateSheet(string path)
    195     {
    196         IWorkbook wb = new NPOI.HSSF.UserModel.HSSFWorkbook(); ;
    197         string extension = System.IO.Path.GetExtension(path).ToLower();
    198         if (extension == ".xls")
    199             wb = new NPOI.HSSF.UserModel.HSSFWorkbook();
    200         else if (extension == ".xlsx")
    201             wb = new NPOI.XSSF.UserModel.XSSFWorkbook();
    202 
    203         return wb;
    204     }
    205 
    206     private int GetWidth(DataTable dt, int columnIndex)
    207     {
    208         IList<int> lengths = new List<int>();
    209         foreach (DataRow dr in dt.Rows)
    210             lengths.Add(Convert.ToString(dr[columnIndex]).Length * 256);
    211         return lengths.Max();
    212     }
    213 
    214     private IList<string> GetRowValues(DataRow dr)
    215     {
    216         List<string> rowValues = new List<string>();
    217 
    218         for (int i = 0; i < dr.Table.Columns.Count; i++)
    219             rowValues.Add(Convert.ToString(dr[i]));
    220 
    221         return rowValues;
    222     }
    223 
    224     private IList<string> GetCloumnNames(DataTable dt)
    225     {
    226         List<string> columnNames = new List<string>();
    227 
    228         foreach (DataColumn dc in dt.Columns)
    229             columnNames.Add(dc.ColumnName);
    230 
    231         return columnNames;
    232     }
    233 
    234     private void SetRow(IRow row, IList<string> values)
    235     {
    236         SetRow(row, values, null);
    237     }
    238 
    239     private void SetRow(IRow row, IList<string> values, ICellStyle cellStyle)
    240     {
    241         for (int i = 0; i < values.Count; i++)
    242         {
    243             ICell cell = row.CreateCell(i);
    244             cell.SetCellValue(values[i]);
    245             if (cellStyle != null)
    246                 cell.CellStyle = cellStyle;
    247         }
    248     }
    249 
    250     private ICellStyle GetCellStyle(IWorkbook wb)
    251     {
    252         return GetCellStyle(wb, FontBoldWeight.None);
    253     }
    254 
    255     private ICellStyle GetCellStyle(IWorkbook wb, FontBoldWeight boldweight)
    256     {
    257         ICellStyle cellStyle = wb.CreateCellStyle();
    258 
    259         //字体样式
    260         IFont font = wb.CreateFont();
    261         font.FontHeightInPoints = 10;
    262         font.FontName = "微软雅黑";
    263         font.Color = (short)FontColor.Normal;
    264         font.Boldweight = (short)boldweight;
    265 
    266         cellStyle.SetFont(font);
    267 
    268         //对齐方式
    269         cellStyle.Alignment = HorizontalAlignment.Center;
    270         cellStyle.VerticalAlignment = VerticalAlignment.Center;
    271 
    272         //边框样式
    273         cellStyle.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin;
    274         cellStyle.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin;
    275         cellStyle.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin;
    276         cellStyle.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin;
    277 
    278         //设置背景色
    279         cellStyle.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.White.Index;
    280         cellStyle.FillPattern = FillPattern.SolidForeground;
    281 
    282 
    283         //是否自动换行
    284         cellStyle.WrapText = false;
    285 
    286         //缩进
    287         cellStyle.Indention = 0;
    288 
    289         return cellStyle;
    290     }
    291 
    292     private void AutoSizeColumn(ISheet sheet)
    293     {
    294         //获取当前列的宽度,然后对比本列的长度,取最大值
    295         for (int columnNum = 0; columnNum <= sheet.PhysicalNumberOfRows; columnNum++)
    296             AutoSizeColumn(sheet, columnNum);
    297     }
    298 
    299     private void AutoSizeColumn(ISheet sheet, int columnNum)
    300     {
    301         int columnWidth = sheet.GetColumnWidth(columnNum) / 256;
    302         for (int rowNum = 1; rowNum <= sheet.LastRowNum; rowNum++)
    303         {
    304             IRow currentRow = sheet.GetRow(rowNum) == null ?
    305                 sheet.CreateRow(rowNum) : sheet.GetRow(rowNum);
    306             if (currentRow.GetCell(columnNum) != null)
    307             {
    308                 ICell currentCell = currentRow.GetCell(columnNum);
    309                 int length = System.Text.Encoding.Default.GetBytes(currentCell.ToString()).Length;
    310                 if (columnWidth < length)
    311                     columnWidth = length;
    312             }
    313         }
    314         sheet.SetColumnWidth(columnNum, columnWidth * 256);
    315     }
    316 }

    文件下载

      1 using System;
      2 using System.Collections.Generic;
      3 using System.Linq;
      4 using System.Web;
      5 
      6 using System.IO;
      7 
      8 /// <summary>
      9 /// 文件下载有以下四种方式, 大文件下载的处理方法:将文件分块下载。
     10 /// Response.OutputStream.Write
     11 /// Response.TransmitFile
     12 /// Response.WriteFile
     13 /// Response.BinaryWrite
     14 /// </summary>
     15 public class DownHelper
     16 {
     17     HttpResponse Response = null;
     18     public DownHelper()
     19     {
     20         Response = HttpContext.Current.Response;
     21     }
     22 
     23     public void DownloadByOutputStreamBlock(System.IO.Stream stream, string fileName)
     24     {
     25         using (stream)
     26         {
     27             //将流的位置设置到开始位置。
     28             stream.Position = 0;
     29             //块大小
     30             long ChunkSize = 102400;
     31             //建立100k的缓冲区
     32             byte[] buffer = new byte[ChunkSize];
     33             //已读字节数
     34             long dataLengthToRead = stream.Length;
     35 
     36             Response.ContentType = "application/octet-stream";
     37             Response.AddHeader("Content-Disposition",
     38                 string.Format("attachment; filename={0}", HttpUtility.UrlPathEncode(fileName)));
     39 
     40             while (dataLengthToRead > 0 && Response.IsClientConnected)
     41             {
     42                 int lengthRead = stream.Read(buffer, 0, Convert.ToInt32(ChunkSize));//读取的大小
     43                 Response.OutputStream.Write(buffer, 0, lengthRead);
     44                 Response.Flush();
     45                 Response.Clear();
     46                 dataLengthToRead -= lengthRead;
     47             }
     48             Response.Close();
     49         }
     50     }
     51 
     52     public void DownloadByTransmitFile(string filePath, string fielName)
     53     {
     54         FileInfo info = new FileInfo(filePath);
     55         long fileSize = info.Length;
     56         Response.Clear();
     57         Response.ContentType = "application/x-zip-compressed";
     58         Response.AddHeader("Content-Disposition",
     59             string.Format("attachment;filename={0}", HttpUtility.UrlPathEncode(fielName)));
     60         //不指明Content-Length用Flush的话不会显示下载进度  
     61         Response.AddHeader("Content-Length", fileSize.ToString());
     62         Response.TransmitFile(filePath, 0, fileSize);
     63         Response.Flush();
     64         Response.Close();
     65     }
     66 
     67     public void DownloadByWriteFile(string filePath, string fileName)
     68     {
     69         FileInfo info = new FileInfo(filePath);
     70         long fileSize = info.Length;
     71         Response.Clear();
     72         Response.ContentType = "application/octet-stream";
     73         Response.AddHeader("Content-Disposition",
     74             string.Format("attachment;filename={0}", HttpUtility.UrlPathEncode(fileName)));
     75 
     76         //指定文件大小  
     77         Response.AddHeader("Content-Length", fileSize.ToString());
     78         Response.WriteFile(filePath, 0, fileSize);
     79         Response.Flush();
     80         Response.Close();
     81     }
     82 
     83     public void DownloadByOutputStreamBlock(string filePath, string fileName)
     84     {
     85         using (FileStream stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read))
     86         {
     87             //指定块大小  
     88             long chunkSize = 102400;
     89             //建立一个100K的缓冲区  
     90             byte[] buffer = new byte[chunkSize];
     91             //已读的字节数  
     92             long dataToRead = stream.Length;
     93 
     94             //添加Http头  
     95             Response.ContentType = "application/octet-stream";
     96             Response.AddHeader("Content-Disposition",
     97                 string.Format("attachment;filename={0}", HttpUtility.UrlPathEncode(fileName)));
     98             Response.AddHeader("Content-Length", dataToRead.ToString());
     99 
    100             while (dataToRead > 0 && Response.IsClientConnected)
    101             {
    102                 int length = stream.Read(buffer, 0, Convert.ToInt32(chunkSize));
    103                 Response.OutputStream.Write(buffer, 0, length);
    104                 Response.Flush();
    105                 Response.Clear();
    106                 dataToRead -= length;
    107             }
    108             Response.Close();
    109         }
    110     }
    111 
    112     public void DownloadByBinary(string filePath, string fileName)
    113     {
    114         using (FileStream stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read))
    115         {
    116             //指定块大小  
    117             long chunkSize = 102400;
    118             //建立一个100K的缓冲区  
    119             byte[] bytes = new byte[chunkSize];
    120             //已读的字节数  
    121             long dataToRead = stream.Length;
    122 
    123             //添加Http头  
    124             Response.ContentType = "application/octet-stream";
    125             Response.AddHeader("Content-Disposition",
    126                 string.Format("attachment;filename={0}", HttpUtility.UrlPathEncode(fileName)));
    127 
    128             Response.AddHeader("Content-Length", bytes.Length.ToString());
    129             Response.BinaryWrite(bytes);
    130             Response.Flush();
    131             Response.Close();
    132         }
    133     }
    134 
    135     public void DownloadByBinaryBlock(string filePath, string fileName)
    136     {
    137         using (FileStream stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read))
    138         {
    139             //指定块大小  
    140             long chunkSize = 102400;
    141             //建立一个100K的缓冲区  
    142             byte[] buffer = new byte[chunkSize];
    143             //已读的字节数  
    144             long dataToRead = stream.Length;
    145 
    146             //添加Http头  
    147             Response.ContentType = "application/octet-stream";
    148             Response.AddHeader("Content-Disposition",
    149                 string.Format("attachment;filename={0}", HttpUtility.UrlPathEncode(fileName)));
    150             Response.AddHeader("Content-Length", dataToRead.ToString());
    151 
    152             while (dataToRead > 0 && Response.IsClientConnected)
    153             {
    154                 int length = stream.Read(buffer, 0, Convert.ToInt32(chunkSize));
    155                 Response.BinaryWrite(buffer);
    156                 Response.Flush();
    157                 Response.Clear();
    158 
    159                 dataToRead -= length;
    160             }
    161             Response.Close();
    162         }
    163     }
    164 }

    自定义特性

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Web;
     5 
     6 [AttributeUsage(AttributeTargets.Property | AttributeTargets.Class)]
     7 public class EntityMappingAttribute : Attribute
     8 {
     9     public string Name { get; set; }
    10 }
  • 相关阅读:
    BZOJ5212 ZJOI2018历史(LCT)
    BZOJ5127 数据校验
    253. Meeting Rooms II
    311. Sparse Matrix Multiplication
    254. Factor Combinations
    250. Count Univalue Subtrees
    259. 3Sum Smaller
    156. Binary Tree Upside Down
    360. Sort Transformed Array
    348. Design Tic-Tac-Toe
  • 原文地址:https://www.cnblogs.com/guohu/p/2691073.html
Copyright © 2011-2022 走看看