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文件,就会更加方便。
数据的导入导出,用户习惯把数据记录在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文件,就会更加方便。
相关文章推荐
- C#开发学习笔记:C#利用代码导入Excel数据
- C#开发教程之利用特性自定义数据导出到Excel
- 利用Visio 2003 Drawing Control的C#应用开发系列
- 使用C#进行基于PI的开发(三)——应用PISDK和PIAPI从PI数据库读取数据
- 利用C#开发基于snmpsharpnet基础的SNMP开发应用
- c#将数据导入Excel另类方法
- Android应用开发之获取web服务器xml数据
- Win8应用开发数据存储及xml文件读写
- Android应用开发之通过HTTP协议发送XML数据并调用
- 【Android 应用开发】分析各种Android设备屏幕分辨率与适配 - 使用大量真实安卓设备采集真实数据统计
- C#开发学习笔记:利用XML配置文件连接数据库
- 【转】利用xml开发新闻发布系统(C#)
- windows8开发-metro应用中使用xml+json作为数据存储方式
- ios开发UI篇-iOS应用数据存储方式(XML属性列表 -plist)e二
- 【iOS-cocos2d-X 游戏开发之九】Cocos2dx利用CCSAXParser解析xml数据&CCMutableDictionary使用与注意!
- iOS开发UI篇—ios应用数据存储方式(XML属性列表-plist)
- C#实现几十万级数据导出Excel及Excel各种操作实例
- ArcView GIS 应用与开发技术(8)- 利用空间关系累加数据
- 【Android 应用开发】分析各种Android设备屏幕分辨率与适配 - 使用大量真实安卓设备采集真实数据统计
- C#开发——winform中将Excel数据导入DataGridView