最近项目中有数据的导入导出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. 看jQuery的这几天

    现在在做SPA时,有很多非常好用而且流行的前端框架,比如Vue,React,Angular等,jQuery似乎要逐渐退出前端的舞台了.不得不说,'write less,do more' 这句话吸引了我 ...

  2. 使用 PowerShell 创建 Azure VM 的自定义映像

    自定义映像类似于应用商店映像,不同的是自定义映像的创建者是你自己. 自定义映像可用于启动配置,例如预加载应用程序.应用程序配置和其他 OS 配置. 在本教程中,你将创建自己的 Azure 虚拟机自定义 ...

  3. Oracle EBS INV 删除保留

    DECLARE p_rsv apps.inv_reservation_global.mtl_reservation_rec_type; p_dummy_sn apps.inv_reservation_ ...

  4. redie config 详解

    # redis 配置文件示例 # 当你需要为某个配置项指定内存大小的时候,必须要带上单位,# 通常的格式就是 1k 5gb 4m 等酱紫:## 1k => 1000 bytes# 1kb =&g ...

  5. Windows Server 2012 R2 创建AD域

        前言 我们按照下图来创建第一个林中的第一个域.创建方法为先安装一台Windows服务器,然后将其升级为域控制器.然后创建第二台域控制器,一台成员服务器与一台加入域的Win8计算机. 环境 网络 ...

  6. DevExpress05、TileControl、AlertControl

    TileControl控件 该控件是根据Windows 8的用户界面设计的,可以轻松地把各个控制块集成到窗体上. 1.   IndertBetweenGroups属性 控制两个Group之间的间距: ...

  7. [python] os.path模块常用方法汇总

    os.path.abspath(path) #返回绝对路径 os.path.basename(path) #返回文件名 os.path.commonprefix(list) #返回list(多个路径) ...

  8. [python]pip 版本9.0.1升级到10.0.1故障解决办法

    问题背景: 在做android自动化时使用到第三方库uiautomator时,提示要安装,但安装该uiautomator库时提示当前的pip版本偏低,需要安装10.0.1版本方可.但在升级到升级到该版 ...

  9. jfreechart createBarChart 去掉立体感

    就是图中每个柱上的白条 提问者采纳   加上这句:barRenderer.setBarPainter(new StandardBarPainter())

  10. 1036. [ZJOI2008]树的统计【树链剖分】

    Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成 一些操作: I. CHANGE u t : 把结点u的权值改为t II. ...