excel的另类玩法-另存“xml数据”后利用c#开发各种应用

需要针对excel的数据开发应用程序有几种常见情形:

  • 数据的导入导出,用户习惯把数据记录在excel,然后我们需要导入到我们的应用或者数据库中;
  • 复杂的统计分析,有些excel数据比较复杂,单靠excel那些函数或者VBA搞不定或者不好搞的情况;
  • 使用excel作用户接口的情况,随时收集数据,和第一个情况一样,也是数据的进出。

我们可以在c#里打开excel然后调用office接口操作数据(方法略,大家应该都很熟悉,网上也很多),不过说实话,各人不太喜欢这种方式,反正那些接口对我来说使用起来太过复杂,而且也经常有诸多稀奇古怪的问题导致失败,也许是我太笨啦。

 

所以采取下面的方法:(代码还没写,后面补充)

 

第一步:把excel另存为临时xml数据文件,代码如下:

        /// <summary>
        /// 把excel文件转换成excel的xml数据文件
        /// </summary>
        /// <param name="inExcelPath">excel的fullfilename</param>
        /// <param name="outXmlPath">xml的fullfilename</param>
        /// <returns>true or false</returns>
        private bool excel2Xml(string inExcelPath, string outXmlPath)
        {
            Excel.Application app = new Microsoft.Office.Interop.Excel.Application();
            app.Workbooks.Add(inExcelPath);
            app.Visible = false;
            object opt = System.Reflection.Missing.Value;
            app.Workbooks[1].SaveAs(outXmlPath,Excel.XlFileFormat.xlXMLSpreadsheet,opt,opt,opt,opt,Excel.XlSaveAsAccessMode.xlNoChange,opt,
                opt,opt,opt,opt);
            app.Quit();
            if (app != null)
            {
                int generation = GC.GetGeneration(app);
                app = null;
                GC.Collect(generation);
            }
            int i=0;
            do
            {
                System.Threading.Thread.Sleep(1000);
                if (i > 30000) return false;
            } while (app != null);
            return true;
        }

第三步:利用c#、xml对数据进行操作,代码如下:

            XmlDocument xmldoc = new XmlDocument();
            xmldoc.Load(outPath);
            XmlNamespaceManager ns = new XmlNamespaceManager(xmldoc.NameTable);
            ns.AddNamespace("ns", "urn:schemas-microsoft-com:office:spreadsheet");
            foreach (XmlNode xn in xmldoc.SelectNodes("//ns:Row", ns))
            {
                MessageBox.Show("第一行第一列:"+xn.ChildNodes[0].InnerText);
            }

第三步:利用c#、xml对excel的xml数据文件保存或者新建excel的xml数据文件,代码如下:

        /// <summary>
        ///
        /// </summary>
        /// <param name="filename">另存为.xls就直接能用excel打开拉</param>
        private void createNewExcelXml(string filename)
        {
          string content="<?xml version=/"1.0/"?>"+
"<?mso-application progid=/"Excel.Sheet/"?>"+
"<Workbook xmlns=/"urn:schemas-microsoft-com:office:spreadsheet/""+
 " xmlns:ss=/"urn:schemas-microsoft-com:office:spreadsheet/">"+
 "<Worksheet ss:Name=/"Sheet1/">"+
  "<Table>"+
   "<Row>"+
    "<Cell><Data ss:Type=/"String/">a</Data></Cell>"+
    "<Cell><Data ss:Type=/"String/">b</Data></Cell>"+
    "<Cell><Data ss:Type=/"String/">c</Data></Cell>"+
   "</Row>"+
  "</Table>"+
  "</Worksheet>"+
"</Workbook>";

          XmlDocument xmldoc = new XmlDocument();
          xmldoc.LoadXml(content);
          xmldoc.Save(filename);
        }

 

 

除了第一步之外,不再涉及office接口,个人觉得这样的方法比较清洁,而且随着office的xml化,模块也更容易升级。

而第一步如果由用户人工实现,直接另存提供.xml文件,就会更加方便。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值