您的位置:首页 > 编程语言 > C#

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

2009-09-15 22:53 609 查看
需要针对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文件,就会更加方便。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: