将DataTable导出为Excel (XML Spreadsheet).

C#导出Excel cvs数据 using System;using System.Collections.Generic;using System.Text;using System.Data;using System.Windows.Forms;using System.IO; namespace TopAPI{    class ExcelCreate        {        public void C 阅读详情

前阵子公司有同事需要将搜索页面的搜索结果导出成Excel文件. 用几个不同的办法做了出来. 最后部署时发现: 用COM+组件行不通, 服务器上没装OFFICE; 用OWC也不行, 因为服务器是64位的, OWC不支持; 导出成Excel2003支持的xml, 这招最灵活, 也是一个简单可行的办法.

首先用Excel 2003新建一个空白Wookbook, 然后保存为XML Spreadsheet. 然后打开看它生成的XML代码就能了解XML Spreadsheet的基本结构了.
我先把DataTable生成XML数据, 再使用一个XLS把XML数据转换成XML Spreadsheet的结构.

using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Reflection;
using System.Text;
using System.Xml;
using System.Xml.Xsl;

namespace AProject
{
    public class ExcelHelper
    {
        public static string ExportAsTempFile(DataTable dataTable, bool appendColumnNames)
        {
            if(dataTable == null)
            {
                return null;
            }

            return ExportAsTempFile(new DataTable[] { dataTable }, appendColumnNames);
        }

        public static string ExportAsTempFile(DataSet dataSet, bool appendColumnNames)
        {
            string fileName = Path.GetTempFileName();

            if(ExportFile(dataSet, fileName, appendColumnNames))
            {
                return fileName;
            }

            return null;
        }

        public static string ExportAsTempFile(DataTable[] dataTables, bool appendColumnNames)
        {
            string fileName = Path.GetTempFileName();

            if(ExportFile(dataTables, fileName, appendColumnNames))
            {
                return fileName;
            }

            return null;
        }

        public static bool ExportFile(DataTable dataTable, string fileName, bool appendColumnNames)
        {
            if(dataTable == null)
            {
                return false;
            }

            return ExportFile(new DataTable[] { dataTable }, fileName, appendColumnNames);
        }

        public static bool ExportFile(DataSet dataSet, string fileName, bool appendColumnNames)
        {
            if(dataSet == null)
            {
                return false;
            }

            DataTable[] dataTables = new DataTable[dataSet.Tables.Count];
            dataSet.Tables.CopyTo(dataTables, 0);
            return ExportFile(dataTables, fileName, appendColumnNames);
        }

        public static bool ExportFile(DataTable[] dataTables, string fileName, bool appendColumnNames)
        {
            if(dataTables == null || dataTables.Length == 0 || string.IsNullOrEmpty(fileName))
            {
                return false;
            }

            XmlDocument xmlDoc = GetXmlDataTables(dataTables, appendColumnNames);
            XmlDocument xlsDoc = TransformXml(xmlDoc);

            try
            {
                xlsDoc.Save(fileName);
                return true;
            }
            catch
            {
                return false;
            }
        }

        private static XmlDocument GetXmlDataTables(DataTable[] dataTables, bool appendColumnNames)
        {
            if(dataTables == null)
            {
                return null;
            }

            XmlDocument xmlDoc = new XmlDocument();
            XmlElement rootNode = xmlDoc.CreateElement("DTS");
            XmlElement tableNode;
            XmlElement rowNode;
            XmlElement colNode;
            DataTable dt;

            for(int i = 0; i < dataTables.Length; i++)
            {
                dt = dataTables[i];

                if(dt == null)
                {
                    break;
                }

                if(dt.TableName.Trim() == string.Empty)
                {
                    dt.TableName = "DataTable" + i.ToString();
                }

                tableNode = xmlDoc.CreateElement("DT");
                tableNode.SetAttribute("N", dt.TableName);

                if(appendColumnNames)
                {
                    rowNode = xmlDoc.CreateElement("DR");

                    foreach(DataColumn dc in dt.Columns)
                    {
                        colNode = xmlDoc.CreateElement("DC");
                        colNode.SetAttribute("N", dc.ColumnName);
                        colNode.SetAttribute("T", "String");
                        colNode.AppendChild(xmlDoc.CreateTextNode(dc.ColumnName));
                        rowNode.AppendChild(colNode);
                    }

                    tableNode.AppendChild(rowNode);
                }


                foreach(DataRow dr in dt.Rows)
                {
                    rowNode = xmlDoc.CreateElement("DR");

                    foreach(DataColumn dc in dt.Columns)
                    {
                        colNode = xmlDoc.CreateElement("DC");
                        colNode.SetAttribute("N", dc.ColumnName);
                        colNode.SetAttribute("T", GetDataType(dc.DataType));
                        colNode.AppendChild(xmlDoc.CreateTextNode(GetTextValue(dc.DataType, dr[dc.ColumnName])));
                        rowNode.AppendChild(colNode);
                    }

                    tableNode.AppendChild(rowNode);
                }

                rootNode.AppendChild(tableNode);
            }

            xmlDoc.AppendChild(rootNode);
            return xmlDoc;
        }

        private static string GetTextValue(Type type, object value)
        {
            string text;

            if(type == typeof(DateTime))
            {
                text = ((DateTime)value).ToString("yyyy-MM-ddTHH:mm:ssZ");
            }
            else
            {
                text = value.ToString();
            }

            return text;
        }

        private static string GetDataType(Type type)
        {
            string dataType;

            if(type == typeof(string))
            {
                dataType = "String";
            }
            else if(type == typeof(DateTime))
            {
                dataType = "DateTime";
            }
            else if(type == typeof(bool))
            {
                dataType = "Boolean";
            }
            else
            {
                dataType = "Number";
            }

            return dataType;
        }

        private static XmlDocument TransformXml(XmlDocument xmlDoc)
        {
            XmlDocument xlsDoc = new XmlDocument();
            XslCompiledTransform xslt = new XslCompiledTransform();
            Assembly assembly = Assembly.GetExecutingAssembly();

            using(Stream s = assembly.GetManifestResourceStream("AProject.Resources.XmlSpreadsheet.xsl"))
            {
                if(s != null)
                {
                    xslt.Load(XmlReader.Create(s));
                    MemoryStream output = new MemoryStream();
                    XmlTextWriter xmlWriter = new XmlTextWriter(output, Encoding.UTF8);
                    xslt.Transform(xmlDoc, xmlWriter);
                    output.Position = 0;
                    xlsDoc.Load(output);
                    xlsDoc.PrependChild(xlsDoc.CreateXmlDeclaration("1.0", null, null));
                    output = null;
                }
            }

            return xlsDoc;
        }
    }
}

   xml version="1.0" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">
    <xsl:output method='xml' version='1.0'/>
    <xsl:template match="DTS">
        <ss:Workbook >
            <ss:Styles>
                <ss:Style ss:ID="Default">
                    <ss:NumberFormat ss:Format="General"/>
                
    ss:Style>
                <ss:Style ss:ID="DateTime">
                    <ss:NumberFormat ss:Format="General Date"/>
                
     ss:Style>
            
      ss:Styles>
            <xsl:apply-templates select="DT" />
        
       ss:Workbook>
    
        xsl:template> <xsl:template match="DT"> <ss:Worksheet> <xsl:attribute name="ss:Name"> <xsl:value-of select="@N"/> 
         xsl:attribute> <ss:Table> <xsl:apply-templates select="DR" /> 
          ss:Table> 
           ss:Worksheet> 
            xsl:template> <xsl:template match="DR"> <ss:Row> <xsl:apply-templates select="DC" /> 
             ss:Row> 
              xsl:template> <xsl:template match="DC"> <ss:Cell> <xsl:choose> <xsl:when test="@T = 'DateTime'"> <xsl:attribute name="ss:StyleID"> <xsl:text>DateTime
               xsl:text> 
                xsl:attribute> 
                 xsl:when> 
                  xsl:choose> <ss:Data> <xsl:attribute name="ss:Type"> <xsl:value-of select="@T"/> 
                   xsl:attribute> <xsl:choose> <xsl:when test="@T = 'String'"> <xsl:text disable-output-escaping="yes"><![CDATA[
                    xsl:text> <xsl:value-of select="."/> <xsl:text disable-output-escaping="yes">]]>
                     xsl:text> 
                      xsl:when> <xsl:otherwise> <xsl:value-of select="."/> 
                       xsl:otherwise> 
                        xsl:choose> 
                         ss:Data> 
                          ss:Cell> 
                           xsl:template> 
                            xsl:stylesheet>

 

参考链接: XML Spreadsheet Reference

采购订单定价策略 超详细 ‘需求’字段里填写的是一个例程编号(例程是一段判断程序),如果我们在需求中维护了例程编号,那只有这个例程条件被满足时,这个条件表才会被系统自动读取。一部分的条件表只有在凭证项目满足一定的条件时才会被读取。 ‘排斥的’字段如果别勾中的话,那表明如果这个条件表被系统成功读取到数据后,系统将停止这个存取顺序的执行,否则,系统将继续执行下去。 注意:a、如果我们给某个条件类型设定了有效期的话,那我们必须给这个条件类型分配一个存取顺序。 b、不能给一个抬头条件分配存取顺序。 是... 阅读详情

相关推荐

Aspose Java 25.10 版本深度破解:基于字节码修改的实战指南

本文提供了Aspose Java 25.10版本基于字节码修改的实战指南。详细介绍了如何通过Javassist工具逆向分析并修改Aspose Cells、Words、Slides及PDF组件的许可证验证逻辑,从而实现绕过限制,并完成最终的打包与功能验证。

stone的博客 1358

Excel 2003的XML文件格式

    表格软件的的层次结构一般都比较简单,整个文件是一个Workbook节点,Workbook中可以包含多个Worksheet,Worksheet有多个Row对象,每个Row包含多个Cell.    Workbook             Worksheet                      Row                           Cell             

dengyunze 3971

未来智能家居解决方案:AI应用架构师的前沿探索

当你加班到深夜回家时,门锁自动识别你的脚步声解锁,玄关灯渐亮成你最爱的暖光,空调早已调到25℃(你夏天的习惯温度),音箱播放着最近循环的爵士乐,茶几上的智能水壶烧好了温水——这不是科幻电影,而是未来智能家居的日常。如何让“冰冷的设备”变成“懂你的伙伴”。我们将深入探讨五大前沿技术(边缘AI、多模态融合、联邦学习、数字孪生、个性化推荐)的底层原理,用“家里的小管家”“邻居互相学习”等生活化比喻简化复杂概念,结合代码示例与架构图还原实现流程,并通过智能卧室、智能厨房等真实案例展示落地路径。

AI天才研究院 1411

调试经验——用XML格式定义Excel (.xls格式)文件 (XML Spreadsheet format in Excel)

今天发现可以用XML格式来定义一个Excel文件。将以下代码保存为.xls格式,然后可以用Excel打开。&lt;?xml version="1.0"?&gt; &lt;Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" x...

预见未来to50的专栏 3461

Windows 10 下 Nacos 3.0.2 单机版保姆级安装教程(含JDK 17配置与MySQL 8.0连接避坑)

本文提供Windows 10下Nacos 3.0.2单机版的详细安装教程,涵盖JDK 17配置、MySQL 8.0连接优化及生产级安全设置。通过步骤详解和常见问题解决方案,帮助开发者快速完成Nacos的安装与配置,确保服务发现与配置管理的高效运行。

weixin_29237635的博客 320

2023年数学建模国赛三大赛题核心建模思路与实战代码全解

本文全面解析2023年数学建模国赛三大赛题的核心建模思路与实战代码,涵盖塔式太阳能光热发电系统优化、多波束测深系统动态规划及蔬菜商品化策略建模。通过Python代码示例和优化算法(如遗传算法、NSGA2)展示,帮助参赛者掌握数学建模的关键技术与实战技巧,提升竞赛成绩。

weixin_33713350的博客 334

xml转excel(Office XML转excel)

旧版的 excel 文件 Office XML是xml类型的,也成为SpreadsheetML类型,很古老的excel类型了是2002年左右的格式,现在的格式都是用的 xls 或者 xlsx。遇到的问题就是要把xml类型的 Office XML转化为 xlsx的excel,所以写了本篇文章方便以后遇到这个问题的人。(注意,本文的代码只支持横向的单元格合并,纵向合并的单元格因为会受到横向合并的单元格而对不齐) 二、解析类 SAXHandler类 XmlConvertExcel类 XmlRow类 三、测试

西凉的悲伤博客 6230

中文翻译《ASPICE in practice》之“SUP.8 配置管理”

一般来说,自动化程度越低,负责 CM 的个人就必须花费越多的精力,例如,检查基线的正确性和完整性,或确保在归档系统上正确完成手动版本控制。必须防止未经许可的访问。为了唯一地标识基线,许多 CM 工具提供了一种“标记”基线的机制,即为受影响的 CM 项目的所有版本分配相同的标签,例如“第 3 次交付状态”。此选择必须允许绘制合格的基线(参见 BP5),即确保实际上所有描述特定开发阶段的元素(需求和设计文档、开发环境、变更请求、测试用例、测试文档,也可能是重要的中间工作产品等)都可以在 CM 系统中进行基线。

Smith_Chai的博客 1583

Excel的xml表现格式

随着即将发布 微软的下一个版本®  办公室(目前代号为“Office 12的”),将有微软的Word,PowerPoint新的默认文件格式®和Excel ®。这些称为Microsoft Office Open XML格式的新格式将为Office开发人员打开一个全新的世界。默认情况下,Office文档将是开放和可访问的,因为它们将使用标准的ZIP和XML技术,并提供完整的文档,并且可以免费使用许

有志者事竟成 1万+

干法刻蚀工艺进阶:如何通过调节DC自偏压优化刻蚀速率和各向异性

本文深入探讨了干法刻蚀工艺中DC自偏压的精细调控艺术。DC自偏压是影响刻蚀速率和各向异性的关键因素,文章通过实战案例,详细分析了如何通过调节射频功率、频率、腔室压力及气体成分等参数,间接而有效地控制DC自偏压,从而优化高深宽比硅沟槽等复杂结构的刻蚀效果,实现工艺性能的精准提升。

weixin_28308325的博客 328

【笔记篇】Davinci Configurator BswM模块

AUTOSAR BSWM模块配置介绍

weixin_47571898的博客 1534

excel的xml表示形式

公司一个变态要求把表格导出为excel,另一个变态用的是个鸟(此鸟专指我一同学)都没听说过的tcl。而tcl对这个的支持就根本没有,网上资料也找不到,尼玛的。     经过几天的折磨,最后发现,导出excel文件的需求很常见,java有poi,c#是微软开发的,调同样微软开发的excel更是简单的一塔,别的语言也都有很多人已经开发出组件或者有很多解决方案了,但是tcl这种狗屁语言,网上资料根本就

huwei0518的专栏 3705

华为OD机试双机位C卷:日志排序 (Py/C/C++/Java/Js/Go)

华为OD机试双机C卷真题【日志排序】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。华为OD机试-日志排序。

qq_45776114的博客 1754

将DataTable导出为Excel (XML Spreadsheet)

 http://blog.csdn.net/ericfine/archive/2008/10/24/3137196.aspx前阵子公司有同事需要将搜索页面的搜索结果导出成Excel文件. 用几个不同的办法做了出来. 最后部署时发现: 用COM+组件行不通, 服务器上没装OFFICE; 用OWC也不行, 因为服务器是64位的, OWC不支持; 导出成Excel2003支持的xml, 这招最灵活,

king_idea8848的专栏 559

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

利用OWC组件生成EXCEL表(c#)

Microsoft.Office.Interop.Owc11.SpreadsheetClassoSheet=newSpreadsheetClass();XmlDocumentxmlDoc=newXmlDocument();xmlDoc.Load(Server....

weixin_30607029的博客 114

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

利用EXCEL XML方式导出EXCEL,速度超快

<br />之前博客中也有其他的导出方式,但是最终发现,利用XML方式速度超快,下面是转载的代码<br /> <br /><%@ Page Language="C#" EnableViewState="true" %><br /><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><br /><script runat=

jaylongli的专栏 1874

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

生成Excel的xml,避免使用excel进程

在做项目中遇见了这种情况:需要在Excel某些内容已经存在的情况下,去套用这个“模板” 进行生成Excel 文件同时服务器又不能开启任何Excel进程,我的解决方案就是将其当作xml 进行处理:首先,将基础的Excel(即含有初始内容的模板Excel) 保存至XML形式之后,读取这个xml 节点,接着在节点上放东西,就可以了说起来比较简单,但是操作起来比较恶心,主要是因为xm...

aisuishao7740的博客 129

OpenXML - 如何导出List<DataModel>到Excel -- Part 1

最近这几天研究OpenXML: 这是Open XML的一些介绍: Open XML 介绍:http://baike.baidu.com/view/1201978.htm 下载:http://www.microsoft.com/downloads/en/details.aspx?FamilyID=c6e744e5-36e9-45f5-8d8c-331df206e0d0 然后下载一个Simp...

weixin_30402085的博客 170

C#操作Excel全攻略:COM、NPOI、EPPlus、OpenXML与云API深度对比

在.NET企业级开发中,数据处理与报表生成是核心需求,Excel文件作为广泛使用的数据载体,其高效读写能力直接影响应用性能。其技术原理主要围绕文件格式解析与内存对象模型操作展开,通过不同的库封装实现。从技术价值看,选择合适的Excel操作方案能显著提升开发效率、降低服务器资源消耗并确保跨平台兼容性。常见的应用场景包括数据导出、报表模板填充、服务端批量处理以及数据交换等。针对C#开发,主流方案各具特点:Office COM Interop依赖本地环境但功能完整;NPOI作为Apache移植项目,支持.xls和

weixin_30873847的博客 373

C#导出execel

/// &lt;summary&gt; /// /// &lt;/summary&gt; /// &lt;param name="xlsPath"&gt;xlsPath导出路径&lt;/param&gt; /// &lt;param name="xlsFile"&gt;xlsFile导出名&lt;/param&gt; pub

BSX_null 214
上一篇: SPGridView 研究笔记 Part 3 - 分组
可爱的排骨
博客等级 码龄25年 13粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值