aspose.cells根据模板导出excel
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
aspose.cells根据模板导出excel
⼜隔⼗多天没写博客了,最近都在忙项⽬的事情,公司⼈事变动也⽐较⼤,⼿头上就⼜多了⼀个项⽬。
最近做⽤aspose.cells根据模板导出excel报价单的功能,顺便把相关的核⼼记下来,先上模板和导出的效果图吧,如下:
导出效果图(看到产品图,打不死的程(diao)序(si)员(猿)骚动吧,有没有不禁看了看⾃⼰粗⼤的右⼿):
(其中红⾊框框起来的是动态填充的内容,⼯作薄名(产品信息)也是动态输出的)
模板如下:
⼤概流程是这样,先把需要输出到excel的内容存到⼀个model⾥⾯,然后把该model编程⼀个datatable,然后就直接绑定在指定的excel模板上,然后把excel转成流根据excel格式输出到客户端。
以下为将置顶的model绑定在指定的模板上(模板后⾯附上)
///<summary>
///返回Excel⽂件流
///</summary>
///<param name="model">数据</param>
///<param name="templateFileName">模板⽂件,要全路径</param>
///<param name="sheetName">⼯作簿名称</param>
///<param name="outDesigner">⼯作簿名称</param>
///<returns></returns>
public static MemoryStream OutModelFileToStream(DataTable model, string templateFileName, string sheetName, Action<WorkbookDesigner, DataTable> action) {
WorkbookDesigner designer = new WorkbookDesigner();
designer.Open(templateFileName);
designer.SetDataSource(model);
//对designer做额外操作
if (action != null)
{
action(designer, model);
}
//SetCellWithPicture(designer, model.Rows[0]["ProductLogo"].ToString(), 3, 5, 17, 8);
designer.Process();
if (!string.IsNullOrEmpty(sheetName))
{
designer.Workbook.Worksheets[0].Name = sheetName;
}
return designer.Workbook.SaveToStream();
}
最后⼀个参数action是为了让⽤户可以在将基本的数据绑定在excel表上之后,可以做⼀些额外的补充操作,⽐如说控制某些特殊部分的格式或者说是某个位置要输出图⽚等,我做的时候,就是要在excel表的某个位置动态输出⼀个图⽚才做了如此操作。
以下是输出excel到客户端的代码,如下:
///<summary>
/// ActionResult的输出重写
///</summary>
public override void ExecuteResult(ControllerContext context)
{
//下载
System.IO.MemoryStream ms = AsposeExcelHelper.OutModelFileToStream(Model, TemplateFileName, SheetName, Action);
byte[] bt = ms.ToArray();
string fileName = FileNameHead + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xls";//客户端保存的⽂件名
//以字符流的形式下载⽂件
HttpContext.Current.Response.ContentType = "application/vnd.ms-excel";
//通知浏览器下载⽂件⽽不是打开
HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8));
HttpContext.Current.Response.BinaryWrite(bt);
HttpContext.Current.Response.Flush();
HttpContext.Current.Response.End();
}
然后顺便附上通过委托action来⾃定义输出图像的代码,我这⾥是在指定的单元格输出指定⼤⼩的图⽚,如下:
///<summary>
///
///</summary>
///<param name="designer"></param>
///<param name="url"></param>
///<param name="upX"></param>
///<param name="upY"></param>
///<param name="lowX"></param>
///<param name="lowY"></param>
///<param name="width">设置图⽚对应的单元格宽度</param>
///<param name="height">设置图⽚对应的单元格⾼度</param>
public static void SetCellWithPicture(WorkbookDesigner designer, string url, int upX, int upY, int lowX, int lowY, int? width=null, int? height=null)
{
try
{
var sheet = designer.Workbook.Worksheets[0];
if (width != null)
{
sheet.Cells.SetColumnWidth(upX, width.Value);
}
if (height != null)
{
sheet.Cells.SetRowHeight(upY, height.Value);
}
var objwebClient = new .WebClient();
var objImage = new System.IO.MemoryStream(objwebClient.DownloadData(url));
sheet.Pictures.Add(upX, upY, lowX, lowY, objImage);
}
catch (Exception ex)
{
throw ex;
}
}。