ExcelToXml小工具
来源:互联网 发布:php电商开源系统 2017 编辑:程序博客网 时间:2024/05/18 00:37
界面效果:
一开始认为winform中有类似web中的上传控件,可能还是不熟悉,所有用了一个openFileDialog。
分为几个部分:
#region 将Excel导成xml文件 private void button1_Click(object sender, EventArgs e) { if (!ExistsNetFramework()) { MessageBox.Show("需要安装net framework4.0版本"); return; } if (textBox1.Text != "") { int version = ExistsRegedit(); string strConn = ""; string path = textBox1.Text.Substring(textBox1.Text.Length - 4); if (path == "xlsx") { if (version == 1) { MessageBox.Show("Excel版本不匹配!"); return; } else if (version == 2 || version == 3) { //2007格式 strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + textBox1.Text + ";Extended Properties='Excel 8.0;HDR=False;IMEX=1'"; } else { MessageBox.Show("没有安装Excel文件,或者找不到对应版本的文件!"); return; } } else if (path == ".xls") { if (version == 1) { //2003格式 strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + textBox1.Text + ";Extended Properties='Excel 8.0;HDR=False;IMEX=1'"; } else if (version == 2 || version == 3) { //2007格式 strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + textBox1.Text + ";Extended Properties='Excel 8.0;HDR=False;IMEX=1'"; } else { MessageBox.Show("没有安装Excel文件,或者找不到对应版本的文件!"); return; } } else { MessageBox.Show("文件格式不正确"); return; } OleDbConnection OleConn = new OleDbConnection(strConn); OleConn.Open(); String sql = "SELECT * FROM [Sheet1$]"; OleDbDataAdapter OleDaExcel = new OleDbDataAdapter(sql, OleConn); DataSet dsExcle = new DataSet(); OleDaExcel.Fill(dsExcle, "Product"); DataSet dsEncodeExcel = new DataSet(); foreach (DataTable dt in dsExcle.Tables) { DataTable dtEncodeExcel = new DataTable(); if (dt.Rows.Count > 0) { int count = dt.Rows.Count; //获取表结构 for (int i = 0; i < dt.Rows.Count; i++) { for (int j = 0; j < dt.Columns.Count; j++) { if (i == 0) dtEncodeExcel.Columns.Add(dt.Columns[j].ColumnName, typeof(System.String)); } DataRow drEncodeExcel = dtEncodeExcel.NewRow(); //dtEncodeExcel.ImportRow(dt.Rows[i]); dtEncodeExcel.ImportRow(GetEncodeDR(dt.Rows[i], drEncodeExcel)); dtEncodeExcel.Rows.Add(drEncodeExcel); } } else { MessageBox.Show("表中没有数据"); return; } dsEncodeExcel.Tables.Add(dtEncodeExcel); } ExcelToXml(dsEncodeExcel); OleConn.Close(); } else { MessageBox.Show("请先导入Excel!"); } } #endregion
private void openFileDialog_FileOk(object sender, CancelEventArgs e) { string appPath = ((OpenFileDialog)sender).FileName; try { textBox1.Text = appPath; //带参数启动应用程序 //System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo( ); //startInfo.FileName = "执行EXE的文件名 "; //startInfo.Arguments = "参数数组 "; //System.Diagnostics.Process.Start( startInfo ); //do something 。。。 //Process.Start(appPath); } catch (Exception) { MessageBox.Show("启动失败!"); } } #region 获取文件路径 private void button2_Click(object sender, EventArgs e) { OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Title = @"打开(Open)"; openFileDialog.Filter = @"EXCEl文件(*.xlsx)|*.xlsx|EXCEl文件(*.xls)|*.xls"; openFileDialog.ValidateNames = true; //文件有效性验证ValidateNames,验证用户输入是否是一个有效的Windows文件名 openFileDialog.CheckFileExists = true; //验证路径有效性 openFileDialog.CheckPathExists = true; //验证文件有效性 openFileDialog.FileOk += new CancelEventHandler(openFileDialog_FileOk); openFileDialog.ShowDialog(); } #endregion #region 将excel文件写成xml private void ExcelToXml(DataSet dtExcel) { DataSet ds = new DataSet(); //string filename = "C:\\Users\\Administrator\\Desktop\\Product.xml "; dtExcel.WriteXml("Product.xml"); MessageBox.Show("导出xml文件成功!"); //MessageBox.Show("桌面上生成导出xml文件成功!"); } #endregion
#region excel数据加密 private string Encode(string filed) { //每个人的加密方法各不相同。 } #endregion
#region 将dr内容进行加密处理 private DataRow GetEncodeDR(DataRow dr, DataRow drencode) { for (int i = 0; i < dr.ItemArray.Length; i++) { if (dr[i].ToString() == "" || dr[i].ToString() == string.Empty) dr[i] = DBNull.Value; else if (dr[i].ToString().Contains("")) dr[i].ToString().Replace(" ", ""); drencode[i] = Encode(dr[i].ToString()); } return drencode; } #endregion
#region 判断本机excel安装的是office2003,还是office2007以上版本,还是office2010版本 public int ExistsRegedit() { int num = 0; RegistryKey rk = Registry.LocalMachine; RegistryKey akey2003 = rk.OpenSubKey(@"SOFTWARE\\Microsoft\\Office\\11.0\\Excel\\InstallRoot\\"); RegistryKey akey2007 = rk.OpenSubKey(@"SOFTWARE\\Microsoft\\Office\\12.0\\Excel\\InstallRoot\\"); RegistryKey akey2010 = rk.OpenSubKey(@"SOFTWARE\\Microsoft\\Office\\14.0\\Excel\\InstallRoot\\");
//检查本机是否安装Office2010 if (akey2010 != null) return num = 3;
//检查本机是否安装Office2007 if (akey2007 != null) return num = 2;
//检查本机是否安装Office2003 if (akey2003 != null) return num = 1;
return num; } #endregion
#region 通过注册表判读是否安装.net framework 4.0版本 public bool ExistsNetFramework() { bool flag = false; RegistryKey rk = Registry.LocalMachine; RegistryKey framework4 = rk.OpenSubKey(@"SOFTWARE\\Microsoft\\.NETFramework\\policy\\v4.0\\"); RegistryKey framework35 = rk.OpenSubKey(@"SOFTWARE\\Microsoft\\.NETFramework\\policy\\v3.5\\"); RegistryKey framework31 = rk.OpenSubKey(@"SOFTWARE\\Microsoft\\.NETFramework\\policy\\v3.2\\"); if (framework4 != null) { flag = true; return flag; } return flag; } #endregion
程序基本大体完成,但是还是有很多问题没有解决:
1.读写表的时候是"Sheet1",如果没有的excel中没有的话,这里应该要加一个try...catch 捕获异常。
2.其中牵涉到一个office2003和2007以后的版本问题。如果今后又有office2014之类的如何动态处理。
3.判断office版本和net framework 版本只能通过注册表吗,还有其他有效的方法。Environment.Version只能得到net framework一个版本。
4.做成安装包的时候这个如何把net framework4.0 静默安装,这个看到有,还没做。
- ExcelToXml小工具
- ExcelToXml
- 小工具
- 小工具
- 小工具
- 小工具
- 小工具
- 小工具
- 小工具
- 小工具
- 小工具
- 小工具
- 小工具
- 小工具
- 小工具
- 小工具
- [小工具]代码统计小工具编写
- 小工具抓包工具
- 实战:验证 SCSI-3永久保留失败
- typedef与define的思考 .
- PCI驱动
- Linux开启DMA模式
- 一个已经按升序排序过的数组和一个数字, 在数组中查找两个数,使得它们的和正好等于输入的那个数字
- ExcelToXml小工具
- oracle表分区详解
- Nginx Location配置总结
- ZXing扫描二维码在iphone中的使用
- RPC应用的java实现
- 黑马程序员——String与StringBuffer、StringBuilder的应用与区别
- poj 2288 Islands and Bridges
- 享元模式
- ActiveX和JavaScript交互(Delphi版本)