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. IOS开发之——类似微信摇一摇的功能实现

    首先,一直以为摇一摇的功能实现好高大上,结果百度了.我自己也模仿写了一个demo.主要代码如下: 新建一个项目,名字为AnimationShake. 主要代码: - (void)motionBegan ...

  2. Jenkins入门系列之——00答疑解惑

    写在最前的总结:Jenkins其实就是一个工具,这个工具的作用就是调用各种其他的工具来达成你的目的.比如你要获取Subversion上最新的源代码,Jenkins会去调用SVNKIT(插件的核心Jar ...

  3. Jenkins进阶系列之——11修改Jenkins用户的密码

    说明:本方法仅适用于jdk6+.tomcat6+和Jenkins专有用户数据库的Jenkins! 很多童鞋在使用jenkins的时候忘记密码了,然后各种蛋疼.最近闲着无事,折腾了下.好了,闲话少扯. ...

  4. memcached 适用的场景

    最近在看 memcached  的公共课,发现memcache的确是个好东西,可以显著地减小数据库负载,当然我们要搞清楚,任何一样技术都有它的优缺点, 在使用它的时候,搞清楚它的适用场景,才能扬长避短 ...

  5. 原生js dom记忆的内容

    1.DOM基础getElementByIdgetElementByTagNamegetElementByName getElementsByClass querySelector querySelec ...

  6. T4模板在项目中的使用

    建立T4模板方法:右键添加新项->文本模板 使用T4模板生成Dal层代码如下: <#@ template language="C#" debug="false ...

  7. java日期加减

    1.用java.util.Calender来实现 Calendar calendar=Calendar.getInstance();      calendar.setTime(new Date()) ...

  8. iOS边练边学--Http网络再学习,简单介绍

    一.URL 什么是URL URL中常见的协议 二.Http Http的基本通信过程 发送Http请求的方法 GET 和 POST 对比 GET 和 POST 的选择 三.iOS中的Http学习 iOS ...

  9. yii2URL美化

    yii2的url 域名/index.php?r=site%2Findex 实际为 域名/index.php?r=site/index 可以美化下 可以在main.php中配置 'components' ...

  10. poj2774 后缀数组 求最长公共子串

    Reference:IOI2009论文 http://www.cnblogs.com/ziyi--caolu/p/3192731.html #include "stdio.h" # ...