public class OutExcelReport
{
/// <summary>
/// 把 DataSet 的数据导成 Excel
/// </summary>
/// <param name="p_dsExport">要导出的 DataSet</param>
/// <param name="p_strFileName">下载时客户端默认的文件名</param>
/// <param name="p_blnHaveHeaderText">true 标示第一行是列名,默认值为 true</param>
/// <param name="rrModel">报表统计结果</param>
/// <param name="formType">报表物资类型</param>
public static void DataSetToExcel(DataSet p_dsExport, string p_strFileName, bool p_blnHaveHeaderText, ReportResultModel rrModel, string formType)
{
if (p_dsExport == null)
{
return;
}
string strContext = GenerateWorkSheet(p_dsExport, rrModel, formType);

DownloadExcelFile(strContext, p_strFileName);
}

/// <summary>
///
/// </summary>
/// <param name="p_strFileContext"></param>
/// <param name="p_strFileName"></param>
public static void DownloadExcelFile(string p_strFileContext, string p_strFileName)
{
// Appending Headers
if (CommonFunc.IsNullString(p_strFileName))
{
p_strFileName = "Excel.xls";
}

if (!p_strFileName.Trim().ToLower().EndsWith(".xls"))
{
p_strFileName += ".xls";
}

try
{
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.Buffer = true;
p_strFileName = CommonFunc.UrlEncode(p_strFileName);
HttpContext.Current.Response.ContentType = "application/vnd.ms-excel";
HttpContext.Current.Response.AppendHeader("content-disposition", "attachment; filename=" + p_strFileName);
}
catch
{
}

//Writeout the Content
HttpContext.Current.Response.Write(p_strFileContext);
try
{
HttpContext.Current.Response.End();
}
catch
{
}
}

public static string GenerateWorkSheetBottom(string formType, ReportResultModel rrModel)
{
string[] strArraw = new string[8];
switch (formType.ToLower())
{
case "dormrepair": //宿舍维修申请
{
strArraw = new string[] { "统计项", rrModel.Total, "运行中申请单数", rrModel.Running, "已完成申请单数", rrModel.Finished, "", ""};
break;
}
case "managerepair": //办公维修
{
strArraw = new string[] { "统计项", rrModel.Total, "运行中申请单数", rrModel.Running, "已完成申请单数", rrModel.Finished, "", "" };
break;
}
case "winecollar": //酒水申请
{
strArraw = new string[] { "统计项", rrModel.Total, "运行中申请单数", rrModel.Running, "已完成申请单数", rrModel.Finished, "酒水申请成本汇总", rrModel.AllCost };
break;
}
case "publicactivitysupply"://纪念品
{
strArraw = new string[] { "统计项", rrModel.Total, "运行中申请单数", rrModel.Running, "已完成申请单数", rrModel.Finished, "纪念品申请成本汇总", rrModel.AllCost };
break;
}
case "adminmaterial": //行政物资
{
strArraw = new string[] { "统计项", rrModel.Total, "运行中申请单数", rrModel.Running, "已完成申请单数", rrModel.Finished, "行政物资成本汇总", rrModel.AllCost };
break;
}
case "consumables": //办公用品
{
strArraw = new string[] { "统计项", rrModel.Total, "运行中申请单数", rrModel.Running, "已完成申请单数", rrModel.Finished, "办公文具成本汇总", rrModel.AllCost };
break;
}
case "receptroom": //接待房
{
strArraw = new string[] { "统计项", rrModel.Total, "运行中申请单数", rrModel.Running, "已完成申请单数", rrModel.Finished, "接待房成本汇总", rrModel.AllCost };
break;
}
default:
break;
}

StringBuilder strExcelXml = new StringBuilder();
strExcelXml.Append("<Row></Row>\r\n<Row>");
for (int j = 1; j < 9; j++)
{
strExcelXml.Append("<Cell ss:Index=\"" + (j).ToString() + "\"><Data ss:Type=\"String\">");
strExcelXml.Append(CommonFunc.HtmllEncode(strArraw[j - 1]));
strExcelXml.Append("</Data></Cell>\r\n");
}
strExcelXml.Append("</Row>\r\n");
return strExcelXml.ToString();

}

public static string GenerateWorkSheet(DataSet p_dsExport, ReportResultModel rrModel, string formType)
{
StringBuilder strExcelXml = new StringBuilder();
strExcelXml.Append(ExcelHeader());
strExcelXml.Append(ExcelWorkSheetOptions());

foreach (DataTable dt in p_dsExport.Tables)
{
strExcelXml.Append("<Worksheet ss:Name=\"" + dt.TableName + "\">");
strExcelXml.Append("<Table>");
#region 用车报表导出的表头有两行
//added by dengqian 2013-09-22
if (formType.Equals("manageinfocar") || formType.Equals("industrycar"))
{
strExcelXml.Append(GetHeaderText_tworow(dt));
}
else
{
strExcelXml.Append(GetHeaderText(dt));
}
#endregion
//old: strExcelXml.Append(GetHeaderText(dt));

int intColCount = dt.Columns.Count;
foreach (DataRow dr in dt.Rows)
{
strExcelXml.Append("<Row>\r\n");
for (int j = 0; j < intColCount; j++)
{
strExcelXml.Append("<Cell ss:Index=\"" + (j + 1).ToString() + "\"><Data ss:Type=\"String\">");
strExcelXml.Append(CommonFunc.HtmllEncode(CommonFunc.ObjectToNullStr(dr[j])));
strExcelXml.Append("</Data></Cell>\r\n");
}
strExcelXml.Append("</Row>\r\n");
}
if (rrModel != null)
{
strExcelXml.Append(GenerateWorkSheetBottom(formType, rrModel));
}
strExcelXml.Append("</Table>");
strExcelXml.Append("</Worksheet>");
}
strExcelXml.Append("</Workbook>\r\n");
return strExcelXml.ToString();
}

private static string GetHeaderText(DataTable p_dt)
{
StringBuilder sbRtn = new StringBuilder();
sbRtn.Append("<Row>");
foreach (DataColumn dc in p_dt.Columns)
{
sbRtn.Append("<Cell><Data ss:Type=\"String\">");
sbRtn.Append(dc.ColumnName);
sbRtn.Append("</Data></Cell>\r\n");
}
sbRtn.Append("</Row>");
return sbRtn.ToString();
}

#region 用车报表 两行表头的
//added dengqian 201309016
private static string GetHeaderText_tworow(DataTable p_dt)
{
StringBuilder sbRtn = new StringBuilder();
StringBuilder partRtn = new StringBuilder();
sbRtn.Append("<Row>");

partRtn.Append("<Row>");
int rownum = 0;
foreach (DataColumn dc in p_dt.Columns)
{
if (rownum == 0)
{
sbRtn.Append("<Cell rowSpan='2'><Data ss:Type=\"String\">");
sbRtn.Append(dc.ColumnName);
sbRtn.Append("</Data></Cell>\r\n");
partRtn.Append("<Cell colSpan='3'><Data ss:Type=\"String\"></Data></Cell>\r\n");
}
else if (rownum > 0 && rownum <4)
{
if (rownum == 1)
{
sbRtn.Append("<Cell colSpan='3'><Data ss:Type=\"String\">短途用车(趟)</Data></Cell>\r\n");
}
else
{
sbRtn.Append("<Cell colSpan='3'><Data ss:Type=\"String\"></Data></Cell>\r\n");
}
partRtn.Append("<Cell><Data ss:Type=\"String\">");
partRtn.Append(dc.ColumnName);
partRtn.Append("</Data></Cell>\r\n");
//rownum += 3;
}
else if (rownum >3 && rownum <11)
{
if (rownum == 4)
{
sbRtn.Append("<Cell colSpan='7'><Data ss:Type=\"String\">长途用车(趟)</Data></Cell>\r\n");
}
else
{
sbRtn.Append("<Cell colSpan='3'><Data ss:Type=\"String\"></Data></Cell>\r\n");
}
partRtn.Append("<Cell><Data ss:Type=\"String\">");
partRtn.Append(dc.ColumnName);
partRtn.Append("</Data></Cell>\r\n");
//rownum += 7;
}
else
{
sbRtn.Append("<Cell rowSpan='2'><Data ss:Type=\"String\">");
sbRtn.Append(dc.ColumnName);
sbRtn.Append("</Data></Cell>\r\n");
}
rownum++;
}
sbRtn.Append("</Row>");
partRtn.Append("</Row>");
sbRtn.Append(partRtn);
return sbRtn.ToString();
}

#endregion

/// <summary>
/// Creates Excel Header
/// </summary>
/// <returns>Excel Header Strings</returns>
private static string ExcelHeader()
{
// Excel header
StringBuilder sb = new StringBuilder();
sb.Append("<?xml version=\"1.0\"?>\r\n");
sb.Append("<?mso-application progid=\"Excel.Sheet\"?>\r\n");
sb.Append("<Workbook xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\" ");
sb.Append("xmlns:o=\"urn:schemas-microsoft-com:office:office\" ");
sb.Append("xmlns:x=\"urn:schemas-microsoft-com:office:excel\" ");
sb.Append("xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\" ");
sb.Append("xmlns:html=\"http://www.w3.org/TR/REC-html40\">\r\n");
sb.Append("<DocumentProperties xmlns=\"urn:schemas-microsoft-com:office:office\">");
sb.Append("<Author></Author>");
sb.Append("</DocumentProperties>");
sb.Append("<ExcelWorkbook xmlns=\"urn:schemas-microsoft-com:office:excel\">\r\n");
sb.Append("<ProtectStructure>False</ProtectStructure>\r\n");
sb.Append("<ProtectWindows>False</ProtectWindows>\r\n");
sb.Append("</ExcelWorkbook>\r\n");

return sb.ToString();
}

private static string ExcelWorkSheetOptions()
{
// This is Required Only Once , But this has to go after the First Worksheet's First Table
StringBuilder sb = new StringBuilder();
sb.Append("\r\n<WorksheetOptions xmlns=\"urn:schemas-microsoft-com:office:excel\">\r\n<Selected/>\r\n </WorksheetOptions>\r\n");
return sb.ToString();
}
}

导出方法示例

DataSet ds=....;
OutExcelReport.DataSetToExcel(ds, filename, false, null, "");

不引用office动态库导出excel的更多相关文章

  1. C# Microsoft.Office.Interop.Owc11 导出excel文件

    C# Microsoft.Office.Interop.Owc11 导出excel文件 1.新建项SupremeWindowsForms窗体应用项目(项目平台设置称X86) 注意:因为大多数第三方写的 ...

  2. C++ 动态库导出函数名“乱码”及解决

    C++ 动态库导出函数名“乱码”及解决 刚接触C++,在尝试从 dll 中导出函数时,发现导出的函数名都“乱码”了. 导出过程如下: 新建一个Win32项目: 新建的解决方案里有几个导出的示例: // ...

  3. 【图文】[新手]C++ 动态库导出函数名“乱码”及解决

    刚接触C++,在尝试从 dll 中导出函数时,发现导出的函数名都"乱码"了. 导出过程如下: 新建一个Win32项目: 新建的解决方案里有几个导出的示例: // 下列 ifdef ...

  4. 引用dll动态库,动态库中弹出对话框输入,将输入参数,作为变量继续调用。

    在做支付项目时,引用动态库,动态库弹出支付宝或者微信的支付码,继而接收.最终将结果返回给调用动态库方法. 首先,动态库接收的是一个string 类型的xml,如 public string Pay(s ...

  5. 关于调用office com组件导出Excel

    服务器环境: 环境为win2008 r2,系统为64位,程序是C#的winform.因为需要处理数据,然后生成Excel,耗时太长,就使用了多线程.winform程序是由计划任务启动,每天晚上去跑. ...

  6. GCC制作动态库导出符号表【转】

    转自:https://blog.csdn.net/whb_fei/article/details/76974543 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.cs ...

  7. C# 关于调用office com组件导出Excel

    服务器环境: 环境为win2008 r2,系统为64位,程序是C#的winform.因为需要处理数据,然后生成Excel,耗时太长,就使用了多线程.winform程序是由计划任务启动,每天晚上去跑. ...

  8. windows 动态库导出

    以下内容来自博客:https://blog.csdn.net/fengbingchun/article/details/78825004 __declspec是Microsoft VC中专用的关键字, ...

  9. webform 不实用office控件导出excel StringBuilder 类型拼接字符串表格导出excel

    StringBuilder sb = new StringBuilder(); sb.AppendLine("<meta http-equiv=\"Content-Type\ ...

随机推荐

  1. 结合C++和GDAL实现shapefile(shp)文件的创建和写入

    工具:vs2012+GDAL 2.0 包含头文件: #include "ogrsf_frmts.h" int main() { const char *pszDriverName ...

  2. 分页-pagination

    需先引入jQuery,再引入pagination组件 <script src="jquery.js"></script> <script src=&q ...

  3. [CareerCup] 14.3 Final Finally Finalize 关键字比较

    14.3 What is the difference between final, finally, and finalize? 这道题考察我们Java中的三个看起来很相似的关键字final,fin ...

  4. 【面试必备】Swift 面试题及其答案

    初级 问题1- Swift 1.0 or later 什么是optional类型,它是用来解决什么问题的? 答案:optional类型被用来表示任何类型的变量都可以表示缺少值.在Objective-C ...

  5. 记一次w3wp占用CPU过高的解决过程(Dictionary和线程安全)

    项目上线以来一直存在一个比较揪心的问题,和一个没有信心处理的BUG,那就是在应用程序启动时有可能会导致cpu跑满99%或持续在一个值如50%左右,这样一来对服务器的压力是非常大的,经常出现服务器无法远 ...

  6. So... what's up?

    So... testing markdown editor what to learn in May? html5 canvas api codeigniter framework var test ...

  7. excel导入数据库

    日常工作中,感觉一些基础知识需要做下笔记,可能是刚毕业的缘故吧,还保持着做笔记的习惯,但根据以往经验,纸质笔记最多保持一年,过后想找已是难过登天.电子版笔记感觉很不错,尤其是发布到网络中.笔记内容是本 ...

  8. MyEclipse内存不足问题

    1.修改eclipse.ini 在Myeclipse安装目录下G:\MyEclipse8.5\Genuitec\MyEclipse 8.5有一个myeclipse.ini配置文件,设置如下: -vma ...

  9. Html-Css-div标签设定-剧中

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. Java算法-各种题目总结

    1.排列计算 /*[程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析: 兔子 ...