那天,在CSDN论坛上看见有人问:“现在有一个XML文件,该文件里面有十万行的数据,每行数据有十列,现在要将这种十万行数据包存到word中去,不是简单的将XML中的数据直接存到word中去,而是要在word中建立一个表格,该表格有十万行,每行有十列,整个过程最好要控制在三秒之内,可以延长到五秒内。”

近日,俺在研究那个Office Open XML,正好拿来试试刀。根据要求,俺应该做的步骤:

1.       读取XML文件;

2.       变成Word表格;

3.       写入Word文档;

4.       控制时间,优化编程。

1.准备

十万行,每行十列的数据非常大,俺想测试一下,如果读入内存,不做任何处理然后写成Word文档,需要多长时间,俺的配置是:

硬件:Intel E7200,4G/1033RAM,S-ATA硬盘

软件:MS Windows Server 2003 En R2 X64,Office 2007,VS 2008 Team OOXML SDK 2Bata

假设测试XML文件数据格式如下:

 

 

 

wsdl xml文件生成java xml变成word_office

 

 

在<DataSet>标签内有10万个<S_Dialog>元素。每个<S_Dialog>元素有10个数据。

编写程序,将上述数据读入内存,然后写成Word2007文档,测试所用时间见下:

 

 

wsdl xml文件生成java xml变成word_dialog_02

 

 

 

3.046875秒

 

进一步,精简数据,如图:

 

 

wsdl xml文件生成java xml变成word_dialog_03

 

 

降低时间表示规格,减少数据;

 

 

 

 

 

多次运行结果:

 

 

wsdl xml文件生成java xml变成word_文档_04

 

 

显然,执行时间明显减少。

 

测试XML文件名称:X_Dialog.xml

输出Word2007文件名称:word01.docx

 

测试代码:

staticvoid Main(string[] args)
        {
            CreateNewWordDocument(@"c:/word01.docx");
        }
 
        // 创建一个word文档包
        public static void CreateNewWordDocument(string
        {
            using (WordprocessingDocument wordDoc = WordprocessingDocument.Create(document, WordprocessingDocumentType.Document))
            {
                // 设置包内容为word文档格式并打开.
                MainDocumentPart
 
                SetMainDocumentContent(mainPart);
            }
        }
 
        //设置主文档内容.
        public static void SetMainDocumentContent(MainDocumentPart
        {
            string docXml = "";
            System.DateTime ks=System.DateTime.Now;
            Console.WriteLine("开始时间是:{0:o}", ks);
 
            FileStream fs = File.Open("X_Dialog.xml", FileMode.Open);
            XmlDocument doc = new XmlDocument();
            doc.Load(fs);
            docXml = doc.InnerXml.ToString();
 
            using (Stream
            {
                byte[] buf = (new UTF8Encoding()).GetBytes(docXml);
                stream.Write(buf, 0, buf.Length);
            }
            System.DateTime js = System.DateTime.Now;
            Console.WriteLine("结束时间是:{0:o}", js);
            Console.Write("需要时间:{0}",js-ks);
   }

(待续)