本文共 3234 字,大约阅读时间需要 10 分钟。
在网页中做复杂报表都是一件很痛苦的事情,如果做好之后又要打印成和excel模板中一模一样的格式那就更痛苦了,调试工作量那叫一个强。
最近也在做一个这样的项目,为了规避打印的问题,我想是不是可以通过他们已经现有的excel模板进行数据导出,这样,一方面我们可以规避数据打印调试,二可以延续客户原有的操作,三还可以作为存档进行备份。
在开发过程中发现,由于网页已经能够正确显示数据了,所以这里面的数据已经和excel中的数据一致了,所以,将gridview对应的datatable直接导出到excel中无疑是一个好办法。但是仔细想有另外一个问题,因为gridview显示的时候对数据有可能进行了一定处理(如%),而且还有可能提取出来的datatable数据为了有通用性,数据字段的个数和顺序与最终显示都不一样。
基于以上问题,我想,可以这样做,首先将gridview 转化为 datatable,然后讲datatable写到对应的excel模板中,最后将其返回给客户端浏览器。
具体做法:
1、将gridview转化为datatable,代码请参考:
2、将datatable保存到excel中去,为了使模板与数据一致,需要有针对性的设置一些参数,这里有一些是与业务相关的,大家仅参考吧,具体方法如下:
public static Boolean Report2Excel(System.Data.DataTable dtReport, String fullTemplateFilePath, String fullOutputFilePath,
int sheetNum,
String nianyue, int nianyueRow, int nianyueColumn,
int dtStartColumn, int dtEndColumn,
int excelStartColumn, int excelStartRow)
{
//如果Datatable为空或没有数据,那么直接返回
if (dtReport == null || dtReport.Rows.Count == 0)
{
return false;
}
Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();
try
{
app.Visible = false;
//Workbook wBook = app.Workbooks.Open(fullTemplateFilePath);
//Workbook wBook = app.Workbooks.Add(true);
Workbook wBook = app.Workbooks.Add(fullTemplateFilePath);
Worksheet wSheet = wBook.Worksheets[sheetNum] as Worksheet;
//写入年月
wSheet.Cells[nianyueRow, nianyueColumn] = nianyue;
//写入数据
int rowcount = dtReport.Rows.Count;
for (int i = 0; i < rowcount; i++)
{
for (int j = 0; j < dtEndColumn - dtStartColumn + 1; j++)
{
wSheet.Cells[excelStartRow + i, excelStartColumn + j] = dtReport.Rows[i][dtStartColumn + j];
}
}
//设置禁止弹出保存和覆盖的询问提示框
app.DisplayAlerts = false;
app.AlertBeforeOverwriting = false;
//保存工作簿
wBook.Save();
//保存excel文件
app.Save(fullOutputFilePath);
app.SaveWorkspace(fullOutputFilePath);
app.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(wSheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject(wBook);
System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
wSheet = null;
wBook = null;
app = null;
GC.Collect();
}
catch (Exception ex)
{
throw ex;
}
return true;
}
3、将生成的excel文件返回给客户端。具体代码如下:
public static void ExportByTemplate(DataTable dtReport, String templateFilePath, String outputFilePath,
int sheetNum,
String nianyue, int nianyueRow, int nianyueColumn,
int dtStartColumn, int dtEndColumn,
int excelStartColumn, int excelStartRow)
{
string fullTemplateFilePath = System.Web.HttpContext.Current.Server.MapPath("~/Resource/ReportTemplate/") + templateFilePath;
string fullOutputFilePath = System.Web.HttpContext.Current.Server.MapPath("~/UploadFiles/TempReport/") + outputFilePath;
ExcelHlper.Report2Excel(dtReport, fullTemplateFilePath, fullOutputFilePath, sheetNum, nianyue, nianyueRow, nianyueColumn, dtStartColumn, dtEndColumn, excelStartColumn, excelStartRow);
HttpContext.Current.Response.ContentType = "application/application/ms-excel";
HttpContext.Current.Response.ContentEncoding = Encoding.UTF8;
HttpContext.Current.Response.AddHeader(
"content-disposition", string.Format("attachment; filename={0}", System.Web.HttpUtility.UrlEncode(outputFilePath, System.Text.Encoding.UTF8)));
HttpContext.Current.Response.ContentType = "application/ms-excel";
HttpContext.Current.Response.TransmitFile(fullOutputFilePath);
}
至此,通过模板导出excel完成。
转载地址:http://dkwni.baihongyu.com/