C# 操作Excel,使用EPPlus

EPPlus下载地址:http://www.codeplex.com/EPPlus

引用命名空间:

using OfficeOpenXml;

using OfficeOpenXml.Table;

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 using System.IO;
  6 using System.Data;
  7 using System.Reflection;
  8 using System.Web;
  9
 10     public static class ExcelUtil
 11     {
 12         private static void dataTableToCsv(DataTable table, string file)
 13         {
 14             string title = "";
 15             FileStream fs = new FileStream(file, FileMode.OpenOrCreate);
 16             StreamWriter sw = new StreamWriter(new BufferedStream(fs), System.Text.Encoding.Default);
 17
 18             for (int i = 0; i < table.Columns.Count; i++)
 19             {
 20                 title += table.Columns[i].ColumnName + "\t"; //栏位:自动跳到下一单元格
 21             }
 22
 23             title = title.Substring(0, title.Length - 1) + "\n";
 24             sw.Write(title);
 25
 26             foreach (DataRow row in table.Rows)
 27             {
 28                 string line = "";
 29
 30                 for (int i = 0; i < table.Columns.Count; i++)
 31                 {
 32                     line += row[i].ToString().Trim() + "\t"; //内容:自动跳到下一单元格
 33                 }
 34                 line = line.Substring(0, line.Length - 1) + "\n";
 35                 sw.Write(line);
 36             }
 37             sw.Close();
 38             fs.Close();
 39         }
 40
 41         /// <summary>
 42         /// 将一组对象导出成EXCEL
 43         /// </summary>
 44         /// <typeparam name="T">要导出对象的类型</typeparam>
 45         /// <param name="objList">一组对象</param>
 46         /// <param name="FileName">导出后的文件名</param>
 47         /// <param name="columnInfo">列名信息</param>
 48         public static void ExExcel<T>(List<T> objList, string FileName, Dictionary<string, string> columnInfo)
 49         {
 50             ExExcel(objList, FileName, columnInfo, null);
 51         }
 52
 53         /// <summary>
 54         /// 将一组对象导出成EXCEL
 55         /// </summary>
 56         /// <typeparam name="T">要导出对象的类型</typeparam>
 57         /// <param name="objList">一组对象</param>
 58         /// <param name="FileName">导出后的文件名</param>
 59         /// <param name="columnInfo">列名信息</param>
 60         /// <param name="other">追加其他内容</param>
 61         public static void ExExcel<T>(List<T> objList, string FileName, Dictionary<string, string> columnInfo, string other)
 62         {
 63             if (columnInfo.Count == 0) { return; }
 64             if (objList.Count == 0) { return; }
 65             //生成EXCEL的HTML
 66             string excelStr = "";
 67
 68             Type myType = objList[0].GetType();
 69             //根据反射从传递进来的属性名信息得到要显示的属性
 70             List<PropertyInfo> myPro = new List<PropertyInfo>();
 71             foreach (string cName in columnInfo.Keys)
 72             {
 73                 PropertyInfo p = myType.GetProperty(cName);
 74                 if (p != null)
 75                 {
 76                     myPro.Add(p);
 77                     excelStr += columnInfo[cName] + "\t";
 78                 }
 79             }
 80             //如果没有找到可用的属性则结束
 81             if (myPro.Count == 0) { return; }
 82             excelStr += "\n";
 83
 84             foreach (T obj in objList)
 85             {
 86                 foreach (PropertyInfo p in myPro)
 87                 {
 88                     excelStr += p.GetValue(obj, null) + "\t";
 89                 }
 90                 excelStr += "\n";
 91             }
 92             if (!string.IsNullOrEmpty(other))
 93             {
 94                 excelStr += other;
 95             }
 96             //输出EXCEL
 97             HttpResponse rs = System.Web.HttpContext.Current.Response;
 98             rs.Clear();
 99             rs.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");
100             rs.AppendHeader("Content-Disposition", "attachment;filename=" + System.Web.HttpUtility.UrlEncode(FileName, Encoding.UTF8));
101             rs.ContentType = "application/ms-excel";
102             rs.Write(excelStr);
103             rs.End();
104         }
105
106         #region 保存数据列表到Excel(泛型)+void SaveToExcel<T>(IEnumerable<T> data, string FileName, string OpenPassword = "")
107         /// <summary>
108         /// 保存数据列表到Excel(泛型)
109         /// </summary>
110         /// <typeparam name="T">集合数据类型</typeparam>
111         /// <param name="data">数据列表</param>
112         /// <param name="FileName">Excel文件</param>
113         /// <param name="OpenPassword">Excel打开密码</param>
114         public static void SaveToExcel<T>(IEnumerable<T> data, string FileName, string OpenPassword = "")
115         {
116             FileInfo file = new FileInfo(FileName);
117             try
118             {
119                 using (ExcelPackage ep = new ExcelPackage(file, OpenPassword))
120                 {
121                     ExcelWorksheet ws = ep.Workbook.Worksheets.Add(typeof(T).Name);
122                     ws.Cells["A1"].LoadFromCollection(data, true, TableStyles.Medium10);
123
124                     ep.Save(OpenPassword);
125                 }
126             }
127             catch (InvalidOperationException ex)
128             {
129                 //Console.WriteLine(ex.Message);
130                 throw ex;
131             }
132         }
133         #endregion
134
135         #region 从Excel中加载数据(泛型)+IEnumerable<T> LoadFromExcel<T>(string FileName) where T : new()
136         /// <summary>
137         /// 从Excel中加载数据(泛型)
138         /// </summary>
139         /// <typeparam name="T">每行数据的类型</typeparam>
140         /// <param name="FileName">Excel文件名</param>
141         /// <returns>泛型列表</returns>
142         private static IEnumerable<T> LoadFromExcel<T>(string FileName) where T : new()
143         {
144             FileInfo existingFile = new FileInfo(FileName);
145             List<T> resultList = new List<T>();
146             Dictionary<string, int> dictHeader = new Dictionary<string, int>();
147
148             using (ExcelPackage package = new ExcelPackage(existingFile))
149             {
150                 ExcelWorksheet worksheet = package.Workbook.Worksheets[1];
151
152                 int colStart = worksheet.Dimension.Start.Column;  //工作区开始列
153                 int colEnd = worksheet.Dimension.End.Column;       //工作区结束列
154                 int rowStart = worksheet.Dimension.Start.Row;       //工作区开始行号
155                 int rowEnd = worksheet.Dimension.End.Row;       //工作区结束行号
156
157                 //将每列标题添加到字典中
158                 for (int i = colStart; i <= colEnd; i++)
159                 {
160                     dictHeader[worksheet.Cells[rowStart, i].Value.ToString()] = i;
161                 }
162
163                 List<PropertyInfo> propertyInfoList = new List<PropertyInfo>(typeof(T).GetProperties());
164
165                 for (int row = rowStart + 1; row < rowEnd; row++)
166                 {
167                     T result = new T();
168
169                     //为对象T的各属性赋值
170                     foreach (PropertyInfo p in propertyInfoList)
171                     {
172                         try
173                         {
174                             ExcelRange cell = worksheet.Cells[row, dictHeader[p.Name]]; //与属性名对应的单元格
175
176                             if (cell.Value == null)
177                                 continue;
178                             switch (p.PropertyType.Name.ToLower())
179                             {
180                                 case "string":
181                                     p.SetValue(result, cell.GetValue<String>(), null);
182                                     break;
183                                 case "int16":
184                                     p.SetValue(result, cell.GetValue<Int16>(), null);
185                                     break;
186                                 case "int32":
187                                     p.SetValue(result, cell.GetValue<Int32>(), null);
188                                     break;
189                                 case "int64":
190                                     p.SetValue(result, cell.GetValue<Int64>(), null);
191                                     break;
192                                 case "decimal":
193                                     p.SetValue(result, cell.GetValue<Decimal>(), null);
194                                     break;
195                                 case "double":
196                                     p.SetValue(result, cell.GetValue<Double>(), null);
197                                     break;
198                                 case "datetime":
199                                     p.SetValue(result, cell.GetValue<DateTime>(), null);
200                                     break;
201                                 case "boolean":
202                                     p.SetValue(result, cell.GetValue<Boolean>(), null);
203                                     break;
204                                 case "byte":
205                                     p.SetValue(result, cell.GetValue<Byte>(), null);
206                                     break;
207                                 case "char":
208                                     p.SetValue(result, cell.GetValue<Char>(), null);
209                                     break;
210                                 case "single":
211                                     p.SetValue(result, cell.GetValue<Single>(), null);
212                                     break;
213                                 default:
214                                     break;
215                             }
216                         }
217                         catch (KeyNotFoundException ex)
218                         {
219                             throw ex;
220                         }
221                     }
222                     resultList.Add(result);
223                 }
224             }
225             return resultList;
226         }
227         #endregion
228
229         /// <summary>
230         /// 创造参数对
231         /// </summary>
232         /// <typeparam name="T"></typeparam>
233         /// <param name="comnName"></param>
234         /// <param name="func"></param>
235         /// <returns></returns>
236         public static KeyValuePair<string, Func<T, string>> CreateKVP<T>(string comnName, Func<T, string> func)
237         {
238             return new KeyValuePair<string, Func<T, string>>(comnName, func);
239         }
240
241         /// <summary>
242         /// 向表中添加列
243         /// </summary>
244         /// <param name="sheet"></param>
245         /// <param name="columnName"></param>
246         public static void AddSheetHeadRange(this ExcelWorksheet sheet, params string[] columnNames)
247         {
248             for (int i = 0; i < columnNames.Length; i++)
249                 sheet.Cells[1, i + 1].Value = columnNames[i];
250         }
251
252         /// <summary>
253         /// 向表中添加行数据
254         /// </summary>
255         /// <typeparam name="T"></typeparam>
256         /// <param name="sheet"></param>
257         /// <param name="listSources"></param>
258         /// <param name="values"></param>
259         public static void AddSheetRow<T>(this ExcelWorksheet sheet, IList<T> listSources, params KeyValuePair<string, Func<T, string>>[] values)
260         {
261             if (values != null && values.Length > 0)
262             {
263                 sheet.AddSheetHeadRange(values.Select(item => item.Key).ToArray());
264                 if (listSources != null && listSources.Count > 0)
265                 {
266                     IList<Func<T, string>> listVs = values.Select(item => item.Value).ToList();
267                     for (int i = 0; i < listSources.Count; i++)
268                     {
269                         for (int j = 0; j < listVs.Count; j++)
270                         {
271                             sheet.Cells[(i + 2), (j + 1)].Value = listVs[j](listSources[i]);
272                         }
273                     }
274                 }
275             }
276         }
277     }

ExcelUtil

使用如下:

System.IO.MemoryStream output = new System.IO.MemoryStream();
using (ExcelPackage package = new ExcelPackage(output))
{
 ExcelWorksheet sheet = package.Workbook.Worksheets.Add("Demo");
 sheet.AddSheetRow<TEntity>(new List<TEntity>(),
  ExcelUtil.CreateKVP<TEntity>("col1", item => item.P1),
  ExcelUtil.CreateKVP<TEntity>("col2", item => item.P2)
 );
 
 sheet.Cells.AutoFitColumns(0);
 string filename =string.Format("/uploads/{0}.xls", DateTime.Now.ToString("yyyyMMdd"));
 package.SaveAs(new System.IO.FileInfo(Server.MapPath(filename)));
 output.Position = 0;
}

时间: 2024-10-25 21:20:26

C# 操作Excel,使用EPPlus的相关文章

C#使用第三方组件Epplus操作Excel表

Epplus操作Excel基础详解 1.什么是Epplus Epplus是一个使用Open Office XML文件格式,能读写Excel2007/2010文件的开源组件,在导出Excel的时候不需要电脑上安装office. 其中,Open Office XML文档格式包括我们常见的xlsx.docx.pptx等,换而言之,我们常见的这些格式的文件都是基于捆绑XML文件的,使用Epplus操作的本质是通过操作XML文件去操作xlsx.XML,是一种可扩展标记语言,在计算机中,标记指计算机能理解的

使用EPPLUS操作EXcel

使用EPPLUS操作EXcel 时间 2014-11-06 19:28:01  姜糖水 原文  http://www.cnphp6.com/archives/58648 主题 Excel 1 下载Epplus最新版: http://epplus.codeplex.com/ 2 在项目中添加引用 EEPULS.dll(测试环境Win7+V2010旗舰) 3  添加using引用 using OfficeOpenXml; using OfficeOpenXml.Drawing; using Offi

c# ASP.Net 使用开源免费类库操作Excel

主要找到以下类库: MyXls(http://sourceforge.net/projects/myxls/) Koogra(http://sourceforge.net/projects/koogra/) ExcelLibrary(http://code.google.com/p/excellibrary/) ExcelPackage(http://excelpackage.codeplex.com/) EPPlus(http://epplus.codeplex.com/) LinqToExc

[Solution] NPOI操作Excel

NPOI 是 POI 项目的 .NET 版本.POI是一个开源的Java读写Excel.WORD等微软OLE2组件文档的项目.使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 WORD/EXCEL 文档进行读写.NPOI是构建在POI 3.x版本之上的,它可以在没有安装Office的情况下对Word/Excel文档进行读写操作. NPOI官方网站:http://npoi.codeplex.com/ 下载:Install-Package NPOI 本节内容,介绍NPOI的类

POI操作Excel

Excel简介 一个excel文件就是一个工作簿workbook,一个工作簿中可以创建多张工作表sheet,而一个工作表中包含多个单元格Cell,这些单元格都是由列(Column)行(Row)组成,列用大写英文字母表示,从A开始到Z共26列,然后再从AA到AZ又26列,再从BA到BZ再26列以此类推.行则使用数字表示,例如:A3 表示第三行第一列,E5表示第五行第五列. POI工具包 JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI .jxl 只能操作Excel 95, 9

java 操作 Excel,java导出excel

WritableWorkbook out = null; try { response.getServletResponse().reset(); ((HttpServletResponse) response.getServletResponse()).setHeader("Content-Disposition", "attachment;filename=export.xls"); response.getServletResponse().setConten

python操作excel

python操作exce的方式: 使用win32com 使用xlrd(读excel).xlwt(写excel) 1.使用win32com方式 代码: # coding=utf-8 from win32com.client import Dispatch import pywintypes ''' 查看excel最大行数和列数 打开一个空白新建EXCEL表格,按CTRL+下箭头,可以查看到最大行数:按CTRL+右箭头, 可以查看到最大列标(若想显示列数,可在最右一列的某单元格中输入=column(

java使用POI操作excel文件,实现批量导出,和导入

一.POI的定义 JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI .jxl 只能操作Excel 95, 97, 2000也即以.xls为后缀的excel.而poi可以操作Excel 95及以后的版本,即可操作后缀为 .xls 和 .xlsx两种格式的excel. POI全称 Poor Obfuscation Implementation,直译为"可怜的模糊实现",利用POI接口可以通过JAVA操作Microsoft office 套件工具的读写功能.官网:htt

POI组件:POI操作Excel

1.Excel简介 一个excel文件就是一个工作簿workbook,一个工作簿中可以创建多张工作表sheet,而一个工作表中包含多个单元格Cell,这些单元格都是由列(Column)行(Row)组成,列用大写英文字母表示,从A开始到Z共26列,然后再从AA到AZ又26列,再从BA到BZ再26列以此类推.行则使用数字表示,例如:A3 表示第三行第一列,E5表示第五行第五列. 2.POI工具包 POI全称 Poor Obfuscation Implementation,直译为"可怜的模糊实现&qu

JAVA的POI操作Excel

1.1Excel简介 一个excel文件就是一个工作簿workbook,一个工作簿中可以创建多张工作表sheet,而一个工作表中包含多个单元格Cell,这些单元格都是由列(Column)行(Row)组成,列用大写英文字母表示,从A开始到Z共26列,然后再从AA到AZ又26列,再从BA到BZ再26列以此类推.行则使用数字表示,例如:A3 表示第三行第一列,E5表示第五行第五列. 1.2 POI工具包 JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI .jxl 只能操作Exce