最近项目中有数据的导入导出Excel的需求,这里做简单整理。

公司用的是Infragistics的产品,付费,不需要本地安装Office。

有需要的朋友可以下载 Infragistics.2013.2.2098,提取密码:5u17

本文完整代码下载 Demo.Excel.zip

当然,我知道还有其他开源的类库来操作Excel,希望有资源的博友可以一起共享一下。

Infragistics安装使用

直接安装Infragistics_WinForms_20132.msi后再项目Reference中引用既可。操作Excel的话引用Infragistics4.Documents.Excel.v13.2.dll足矣。

导出Excel

支持的格式

  • Excel97To2003
  • Excel97To2003Template
  • Excel2007
  • Excel2007MacroEnabled
  • Excel2007MacroEnabledTemplate
  • Excel2007Template
  • StrictOpenXml

如果用JustCompile查看源码,在不设置任何格式的情况下,默认是保存成Excel 97-2003 Workbook (*.xls)格式的,所以想要导出其他格式的Excel,需要调用SetCurrentFormat(WorkbookFormat format)方法。

使用SaveFileDialog,设置Filter,根据文件的后缀名映射Format。

	public Format GetFormat(string sExtension)
{
switch (sExtension)
{
case ".xls":
return Format.Excel97To2003;
case ".xlt":
return Format.Excel97To2003Template;
case ".xlsx":
return Format.Excel2007;
case ".xltx":
return Format.Excel2007Template;
case ".xlsm":
return Format.Excel2007MacroEnabled;
case ".xltm":
return Format.Excel2007MacroEnabledTemplate;
default:
return Format.Excel97To2003;
}
}

创建Worksheet

定义数据类型

定义Attribute

  • DisplayNameAttribute: 显示Excel的Header

  • WorksheetHeaderAttribute: 定义Header的背景色和前景色

用泛型来填充Worksheet

反射获取属性值

	public bool CreateSheet<T>(string sSheetName, List<T> lstRowData, bool bCreateHeader)
{
ExcelProcessEvent("CreateSheet Start, sSheetName - " + sSheetName + ", lstRowData.Count - " + lstRowData.Count + ", bCreateHeader - " + bCreateHeader);
try
{
Worksheet aWorksheet = _Workbook.Worksheets.Add(sSheetName); Type aType = typeof(T);
if(bCreateHeader) setSheetHeader(aWorksheet, aType);
int rowIndex = bCreateHeader ? 1 : 0;
foreach (var rowdata in lstRowData) {
for (int i = 0; i < aType.GetProperties().Length; i++)
{
var prop = aType.GetProperties()[i];
aWorksheet.Rows[rowIndex].Cells[i].Value = prop.GetValue(rowdata);
//ExcelProcessEvent("CreateSheet InProgress, " + rowIndex + " - " + prop.Name + ": " + prop.GetValue(rowdata).ToString());
}
rowIndex++;
}
ExcelProcessEvent("CreateSheet End, Success");
return true;
}
catch(Exception ex)
{
ExcelErrorEvent("CreateSheet Failed, Error - " + ex.Message);
return false;
}
} private void setSheetHeader(Worksheet oWorksheet, Type oType) {
ExcelProcessEvent("setSheetHeader Start");
for (int i = 0; i < oType.GetProperties().Length; i++)
{
var prop = oType.GetProperties()[i];
string displayName = prop.Name;
try
{
var customAttr = prop.GetCustomAttribute<DisplayNameAttribute>();
displayName = customAttr.DisplayName;
}
catch
{ }
ExcelProcessEvent("setSheetHeader InProgress, displayName - " + displayName);
Color backgroundcolor = Color.White;
Color forecolor = Color.Black;
try
{
var customAttr = prop.GetCustomAttribute<WorksheetHeaderAttribute>();
backgroundcolor = ColorTranslator.FromHtml(customAttr.BackgroundColor);
forecolor = ColorTranslator.FromHtml(customAttr.ForeColor);
}
catch
{ }
ExcelProcessEvent("setSheetHeader InProgress, backgroundcolor - " + backgroundcolor + ", forecolor - " + forecolor);
oWorksheet.Rows[0].Cells[i].Value = displayName;
oWorksheet.Rows[0].Cells[i].CellFormat.Fill = CellFill.CreateSolidFill(backgroundcolor);
oWorksheet.Rows[0].Cells[i].CellFormat.Font.ColorInfo = new WorkbookColorInfo(forecolor);
}
ExcelProcessEvent("setSheetHeader End");
}

保存Workbook

保存成本地文件

保存成字节流(想着做成服务,提供Excel下载)

	public bool Save(string sFileName)
{
ExcelProcessEvent("Save Start, sFileName - " + sFileName);
WorkbookFormat? format = Workbook.GetWorkbookFormat(sFileName);
if (!format.HasValue)
{
ExcelErrorEvent("Save Failed, Error - No matched Workbook format found");
return false;
}
try
{
_Workbook.SetCurrentFormat(format.Value);
if (_Workbook.Worksheets.Count <= 0) _Workbook.Worksheets.Add("Sheet1");
_Workbook.Save(sFileName);
ExcelProcessEvent("Save End, Success");
return true;
}
catch (Exception ex)
{
ExcelErrorEvent("Save Failed, Error - " + ex.Message);
return false;
}
} public bool Save(out byte[] fileBytes, Format eFormat = Format.Excel97To2003)
{
ExcelProcessEvent("Save Start");
fileBytes = new byte[0];
WorkbookFormat? format = formatMap(eFormat);
if (!format.HasValue)
{
ExcelErrorEvent("Save Failed, Error - No matched Workbook format found");
return false;
}
try
{
using (MemoryStream ms = new MemoryStream())
{
_Workbook.SetCurrentFormat(format.Value);
if (_Workbook.Worksheets.Count <= 0) _Workbook.Worksheets.Add("Sheet1");
_Workbook.Save(ms);
ms.Seek(0, SeekOrigin.Begin);
fileBytes = new byte[(int)ms.Length];
ms.Read(fileBytes, 0, fileBytes.Length);
ExcelProcessEvent("Save End, Success");
return true;
}
}
catch (Exception ex)
{
ExcelErrorEvent("Save Failed, Error - " + ex.Message);
return false;
}
}

导入Excel

加载文件

    public bool Load(string sFileName)
{
ExcelProcessEvent("Load Start, sFileName - " + sFileName);
try
{
_Workbook = Workbook.Load(sFileName);
ExcelProcessEvent("Load End, Success");
return true;
}
catch (Exception ex)
{
ExcelErrorEvent("Load Failed, Error - " + ex.Message);
return false;
}
}

解析Worksheet

泛型更通用

反射动态创建类实例

	public List<T> ReadSheet<T>(string sSheetName)
{
ExcelProcessEvent("ReadSheet Start, sSheetName - " + sSheetName);
List<T> lst = new List<T>();
Worksheet aWorksheet = null;
try
{
aWorksheet = _Workbook.Worksheets[sSheetName];
if (aWorksheet == null)
{
ExcelProcessEvent("ReadSheet Failed, Error - No Worksheet found");
return lst;
}
var lstHeaders = aWorksheet.Rows[0].Cells.Select(o => o.Value.ToString()).ToList(); Type rowdataType = typeof(T);
List<KeyValuePair<string, int>> lstHeadersOrder = new List<KeyValuePair<string, int>>(); for (int i = 1; i < aWorksheet.Rows.Count(); i++)
{
var row = aWorksheet.Rows[i];
T obj = (T)Activator.CreateInstance(rowdataType); foreach (var prop in rowdataType.GetProperties())
{
var displayNameAttr = prop.GetCustomAttribute<DisplayNameAttribute>();
string displayName = displayNameAttr.DisplayName;
int cellIndex = lstHeaders.IndexOf(displayName); prop.SetValue(obj, row.Cells[cellIndex].Value);
}
lst.Add(obj);
} return lst;
}
catch (Exception ex)
{
ExcelErrorEvent("ReadSheet Failed, Error - " + ex.Message);
} return lst;
}

客户端调用

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel;
using System.Windows.Media;
using Service.Excel; namespace Demo.Excel.Client
{
public class Book
{
[DisplayName("Book Number")]
[WorksheetHeader("#006699", "#ffffff")]
public string Id { get; set; } [DisplayName("Book Name")]
[WorksheetHeader("#006699", "#ffffff")]
public string Name { get; set; } [DisplayName("Price")]
[WorksheetHeader("#006699", "#ffffff")]
public string Price { get; set; } [DisplayName("Author Name")]
[WorksheetHeader("#006699", "#ffffff")]
public string Author { get; set; } [DisplayName("Book Description")]
[WorksheetHeader("#006699", "#ffffff")]
public string Description { get; set; }
}
}
	private void test_SaveAs()
{
ExcelHelper oExcelHelper = new ExcelHelper();
SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.Filter = "Excel Workbook|*.xlsx|Excel Macro-Enabled Workbook|*.xlsm|Excel 97-2003 Workbook|*.xls|Excel Template|*.xltx|Excel Macro-Enabled Template|*.xltm|Excel 97-2003 Template|*.xlt|Static Open XML Spreadsheet|*.xlsx";
saveFileDialog.FilterIndex = 1;
saveFileDialog.AddExtension = true;
saveFileDialog.FileName = "TestExcel." + DateTime.Now.ToString("yyyyMMddHHmmss");
if (saveFileDialog.ShowDialog() == true)
{
List<Book> lstBook = new List<Book>();
for (int i = 0; i < 2000; i++) {
Book aBook = new Book();
aBook.Id = i.ToString();
aBook.Name = "Book - " + i.ToString();
aBook.Price = i.ToString();
aBook.Author = "Cad-Capture";
aBook.Description = "This is a famous book around the world"; lstBook.Add(aBook);
}
oExcelHelper.CreateSheet<Book>("Book", lstBook, true);
byte[] fileBytes = new byte[0];
if (oExcelHelper.Save(saveFileDialog.FileName))
{ }
}
} private void test_SaveAsBinary()
{
ExcelHelper oExcelHelper = new ExcelHelper();
SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.Filter = "Excel Workbook|*.xlsx|Excel Macro-Enabled Workbook|*.xlsm|Excel 97-2003 Workbook|*.xls|Excel Template|*.xltx|Excel Macro-Enabled Template|*.xltm|Excel 97-2003 Template|*.xlt|Static Open XML Spreadsheet|*.xlsx";
saveFileDialog.FilterIndex = 1;
saveFileDialog.AddExtension = true;
saveFileDialog.FileName = "TestExcel." + DateTime.Now.ToString("yyyyMMddHHmmss");
if (saveFileDialog.ShowDialog() == true)
{ byte[] fileBytes = new byte[0];
if (oExcelHelper.Save(out fileBytes, oExcelHelper.GetFormat(System.IO.Path.GetExtension(saveFileDialog.SafeFileName))))
{
try
{
using (FileStream fileStream = File.OpenWrite(saveFileDialog.FileName))
{
fileStream.Write(fileBytes, 0, fileBytes.Length);
}
}
catch(Exception ex)
{ } }
}
} private void test_Load()
{
ExcelHelper oExcelHelper = new ExcelHelper();
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "Excel Workbook|*.xlsx|Excel Macro-Enabled Workbook|*.xlsm|Excel 97-2003 Workbook|*.xls|Excel Template|*.xltx|Excel Macro-Enabled Template|*.xltm|Excel 97-2003 Template|*.xlt|Static Open XML Spreadsheet|*.xlsx";
openFileDialog.FilterIndex = 1;
openFileDialog.AddExtension = true; if (openFileDialog.ShowDialog() == true)
{
List<Book> lstBook = new List<Book>();
if (oExcelHelper.Load(openFileDialog.FileName)) {
lstBook = oExcelHelper.ReadSheet<Book>("Book");
}
int count = lstBook.Count;
}
}

小结

本文只是简单的数据封装然后导入导出,用了下泛型、反射、数据流、自定义特性,下一篇会搞一搞简单的Excel样式,Excel下载。

另外如何让ExcelHelper类更加的一劳永逸,各位博友有什么更好地想法,欢迎分享。

C#用Infragistics 导入导出Excel(一)的更多相关文章

  1. C#用Infragistics 导入导出Excel

    最近项目中有数据的导入导出Excel的需求,这里做简单整理. 公司用的是Infragistics的产品,付费,不需要本地安装Office. 有需要的朋友可以下载 Infragistics.2013.2 ...

  2. ASP.NET Core 导入导出Excel xlsx 文件

    ASP.NET Core 使用EPPlus.Core导入导出Excel xlsx 文件,EPPlus.Core支持Excel 2007/2010 xlsx文件导入导出,可以运行在Windows, Li ...

  3. thinkphp导入导出excel表单数据

    在PHP项目经常要导入导出Excel表单. 先去下载PHPExcel类库文件,放到相应位置. 我在thinkphp框架中的位置为ThinkPHP/Library/Org/Util/ 导入 在页面上传e ...

  4. 导入导出Excel工具类ExcelUtil

    前言 前段时间做的分布式集成平台项目中,许多模块都用到了导入导出Excel的功能,于是决定封装一个ExcelUtil类,专门用来处理Excel的导入和导出 本项目的持久化层用的是JPA(底层用hibe ...

  5. php中导入导出excel的原理

    在php中我们要经常导入导出excel文件,方便后台管理.那么php导入和导出excel的原理到底是什么呢?excel分为两大版本excel2007(后缀.xlsx).excel2003(后缀.xls ...

  6. NPOI导入导出EXCEL通用类,供参考,可直接使用在WinForm项目中

    以下是NPOI导入导出EXCEL通用类,是在别人的代码上进行优化的,兼容xls与xlsx文件格式,供参考,可直接使用在WinForm项目中,由于XSSFWorkbook类型的Write方法限制,Wri ...

  7. .NET导入导出Excel

    若是开发后台系统,ASP.NET MVC中总是涉及了很多导入导出Excel的问题,有的时候处理起来比较烦 如果能使用以下代码解决,就完美了 public class ReportModel { [Ex ...

  8. Java利用POI导入导出Excel中的数据

         首先谈一下今天发生的一件开心的事,本着一颗android的心我被分配到了PB组,身在曹营心在汉啊!好吧,今天要记录和分享的是Java利用POI导入导出Excel中的数据.下面POI包的下载地 ...

  9. .Net MVC 导入导出Excel总结(三种导出Excel方法,一种导入Excel方法) 通过MVC控制器导出导入Excel文件(可用于java SSH架构)

    .Net MVC  导入导出Excel总结(三种导出Excel方法,一种导入Excel方法) [原文地址] 通过MVC控制器导出导入Excel文件(可用于java SSH架构)   public cl ...

随机推荐

  1. LeetCode题解之Happy Number

    1.题目描述 2.题目分析 根据 happy number 的 性质,如果循环7次还没有到达 1,则这个数不是happy number . 3.代码 bool isHappy(int n) { ) r ...

  2. Android Activity切换与Activity间数据交互

    在Android程序内部, startActivity借助Intent来启动一个子Activity(使用父子关系进行表述,只为表达清晰,Android中并未有父子Activity的概念).如下: In ...

  3. 总结Linux 下Redis 操作常用命令(转)

    Redis的配置 Linux下安装 ]# wget http://download.redis.io/releases/redis-2.8.17.tar.gz ]# tar xzf redis-2.8 ...

  4. EF For Mysql

    http://blog.csdn.net/kmguo/article/details/19650299

  5. 学习H5C3

    不一样的老师,不一样风格,刚开始我们都是非常热情,知道这是非常重要的,我需要坚持,加油!!!

  6. Spring IOC容器创建bean过程浅析

    1. 背景 Spring框架本身非常庞大,源码阅读可以从Spring IOC容器的实现开始一点点了解.然而即便是IOC容器,代码仍然是非常多,短时间内全部精读完并不现实 本文分析比较浅,而完整的IOC ...

  7. HTTP协议详解之url与会话管理

    1 当我们访问一个网址的时候,这中间发生了什么 输入网址——浏览器查找域名的IP地址——浏览器给Web服务器发送一个HTTP请求——服务端处理请—— 服务端发回一个HTTP响应——浏览器渲染显示HTM ...

  8. intellij IDEA软件java项目No SDK配置jdk开发,安装IDEA软件步骤

    我们在使用intellij idea开发java项目的时候,我们在创建的时候会发现提示No SDK,影响创建和使用项目,我们需要下载和配置需要的JDK 电脑 1我们使用intellij idea创建j ...

  9. Posts Tagged ‘This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register问题的解决办法

    HowTo Install redhat package with YUM command without RHN February 26, 2014 in Redhat / Linux Tips a ...

  10. OpenCV——ORB特征检测与匹配

    原文链接:https://mp.weixin.qq.com/s/S4b1OGjRWX1kktefyHAo8A #include <opencv2/opencv.hpp> #include ...