前言:aspose.excel组件是一款做复杂excel的强大工具,比其他的excel组件有更多优势,最近做导出、打印被折磨的死去活来,在网上查很多资料,但是都不是太详细。下面给大家介绍怎样用这个神奇的组件。
第一步:下载一个aspose.excel组件 网上这个资料还算多
第二步:添加引用 在解决方案中-->添加引用->浏览 找到该组件
第三步:写一个excel帮助类(这样在以后的调用中会方便很多)
如下添加一个名为ExcelController的类:
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
namespace LogicBPL.Bpl
{
public class ExcelController : IDisposable
{
private Aspose.Excel.Excel _excel = null;
private Aspose.Excel.Worksheet _activeSheet = null;
public bool OpenDoc(string fileName)
{
Aspose.Excel.License lic = new Aspose.Excel.License();
lic.SetLicense((System.IO.Stream)null);
_excel = new Aspose.Excel.Excel();
_excel.Open(fileName);
if (_excel.Worksheets.Count > 0)
_activeSheet = _excel.Worksheets[0];
return true;
}
public bool OpenDoc(Stream stream)
{
Aspose.Excel.License lic = new Aspose.Excel.License();
lic.SetLicense((System.IO.Stream)null);
_excel = new Aspose.Excel.Excel();
_excel.Open(stream);
if (_excel.Worksheets.Count > 0)
_activeSheet = _excel.Worksheets[0];
return true;
}
public void NewDoc()
{
Aspose.Excel.License lic = new Aspose.Excel.License();
lic.SetLicense((System.IO.Stream)null);
_excel = new Aspose.Excel.Excel();
_excel.Worksheets.Add(Aspose.Excel.SheetType.Worksheet);
_activeSheet = _excel.Worksheets[0];
}
/// <summary>
/// 得到Doc
/// </summary>
public Aspose.Excel.Excel Doc
{
get { return _excel; }
}
/// <summary>
/// 得到当前 Sheet
/// </summary>
public Aspose.Excel.Worksheet ActiveSheet
{
get { return _activeSheet; }
}
/// <summary>
/// 另存为
/// </summary>
/// <param name="filename">文件名</param>
/// <returns>保存是否成功</returns>
public bool SaveAs(string filename)
{
_excel.Save(filename);
return true;
}
/// <summary>
/// 释放资源
/// </summary>
public void Dispose()
{
}
public void SetActiveSheet(int index)
{
if (index >= _excel.Worksheets.Count) throw new Exception("Excel Sheet 号超过最大值。");
_activeSheet = _excel.Worksheets[index];
}
}
}
下面就开始干正事了(前面也很重要)
//-------------------------------导出:--------------------------------------------
在click事件中写调用方法:
protected void btnExport_Click(object sender, EventArgs e)
{
Aspose.Excel.Excel excel = Export(); // 调用导出方法 ,真实的项目环境中最好不要把导出方法写在页面上
// 以下的参数依次为:导出的文件名、导出的excel版本(还可以为其他版本)、保存类型、响应类型(respose会提示客户端是打开还是保存)
excel.Save("userInfo.xls", Aspose.Excel.FileFormatType.Excel2003, Aspose.Excel.SaveType.OpenInExcel, Response); // 还有其他的及格方法重载
}
导出方法:
// 这个方法就体现了写ExcelController类的好处,方便调用
public static Aspose.Excel.Excel Export()
{
using (ExcelController excel = new ExcelController()) // ExcelController类
{
IList<UserSysData> userSysCollection = getAll(); // 获得一个要导出的集合 此处为获得一个存储实体类集合的方法(不多讲,不太清楚查资料,不然废话太多)
try
{
excel.NewDoc(); // 打来一个excel, 相当于打开了一个空excel
int m = 0;
// 往excel里写内容 显示第0行数据
excel.ActiveSheet.Cells[0, m++].PutValue("账号");
excel.ActiveSheet.Cells[0, m++].PutValue("真实姓名");
excel.ActiveSheet.Cells[0, m++].PutValue("工号");
excel.ActiveSheet.Cells[0, m++].PutValue("固定电话
int index = 1;
// 循环实体类集合 从第1行循环往下写
foreach (UserSysData userSys in userSysCollection)
{
m=0;
excel.ActiveSheet.Cells[index, m++].PutValue(userSys.Account != null ? userSys.Account : "");
excel.ActiveSheet.Cells[index, m++].PutValue(userSys.RelName != null ? userSys.RelName : "");
excel.ActiveSheet.Cells[index, m++].PutValue(userSys.JobNumber > 0 ? userSys.JobNumber.ToString() : "");
excel.ActiveSheet.Cells[index, m++].PutValue(userSys.Tel != null ? userSys.Tel : "");
index++;
}
return excel.Doc; // 返回一个excel
}
finally
{
}
}
}
//-------------------------做完导出下面略讲一下打印(很相似)-------------------------------------------------------
打印的概念:是往excel里写数据,不是连打印机打印
打印通常做法是要有一个模板,然后往模板里写数据。如果要设置打印的页眉和页尾可以在模板上提前设置好,其实页眉也可以通过程序控制(页眉内容不限制),但是没有必要。至于页尾内容不是很多的可以通过直接设置模板即可,如果内容比较多建议也为在模板里面做死,因为程序很难控制(主要是格式)。
如果打印要分页分两种情况:
1:页眉(内容不限制)、页尾内容少 、并且打印内容有规律。 这种情况下直接往里写内容,内容多了自动分页
2:页眉(内容不限制)、页尾内容多 。这种情况适合一个workSheet作为一页
啰嗦一大堆下面是如何打印 代码如下
调用(与导出类似):
protected void btnExportPrinet_Click(object sender, EventArgs e)
{
Aspose.Excel.Excel excel = ExportPrint(); // 调用导出方法 ,真实的项目环境中最好不要把导出方法写在页面上
// 以下的参数依次为:导出的文件名、导出的excel版本(还可以为其他版本)、保存类型、响应类型(respose会提示客户端是打开还是保存)
excel.Save("userInfo.xls", Aspose.Excel.FileFormatType.Excel2003, Aspose.Excel.SaveType.OpenInExcel, Response); // 还有其他的及格方法重载
}
打印方法( 在模板里提前写好页眉、页尾等,这种情况下直接往里写内容,内容多了自动分页):
public static Aspose.Excel.Excel ExportPrint(SODetailCond cond)
{
using (ExcelController excel = new ExcelController())
{
if (!excel.OpenDoc(@“D:/a.xls”) // 打开模版文件路径 相当于导出的 excel.NewDoc();
{
throw new SLMSException("print.xls 模板 打开错误!");
}
try
{
IList<UserSysData> userSysCollection = getAll();
int index = 12; // 从第12行写数据,具体情况根据自己的模板而定,此处有删减,但是打印的思想就是这样
int m = 0;
excel.SetActiveSheet(0);
foreach (UserSysData userSys in userSysCollection)
{
//body
m = 0;
excel.ActiveSheet.Cells[index, m++].PutValue(index - 11);//序号
excel.ActiveSheet.Cells[index, m++].PutValue(userSys.Account != null ? userSys.Account : "");
excel.ActiveSheet.Cells[index, m++].PutValue(userSys.RelName != null ? userSys.RelName : "");
excel.ActiveSheet.Cells[index, m++].PutValue(userSys.JobNumber > 0 ? userSys.JobNumber.ToString() : "");
excel.ActiveSheet.Cells[index, m++].PutValue(userSys.Tel != null ? userSys.Tel : "");
index++;
}
}
finally
{
}
return excel.Doc;
}
}
// 由于时间问题,可能有些地方处理不当,在实际的开发中这样写肯定不合适,像程序控制格式、页眉、或者是复制模板。另一个问题是当数据量大(一个workSheet好像只能存储65536行的数据)的时候必须分WorkSheet或者另启动一个excel 再或者通过压缩的方式解决了
此处就当做一个小实例,供大家参考(终于知道这方面的资料那么少了 ,一个字“累”)