在我们的工作中可能会需要到让execl表格转换成xml文件来使用,这样程序读取数据来也比较方便
下面就写一个小程序来实现execl表格转换成xml文件来使用
会使用到的知识点如下
1:引用第三方Execl库
如图:我使用的
添加引用的步骤如下
然后指定库文件的路径就行!
我是放在了应用程序的当前目录下了。
2:Directory类 命名空间System.IO
公开用于通过目录和子目录进行创建、移动和枚举的静态方法。此类不能被继承
主要用到以下方法:
GetCurrentDirectory() 获取应用程序的当前工作目录
public static string[] GetFiles( string path ) 返回指定目录中文件的名称(包括其路径)。
publicstaticstring[] GetFiles( string path, string searchPattern ) 返回指定目录中与指定的搜索模式匹配的文件的名称(包含其路径)
3:Path类 命名空间System.IO
对包含文件或目录路径信息的 String 实例执行操作。 这些操作是以跨平台的方式执行的
返回指定路径字符串的文件名和扩展名。 public static string GetFileName( string path )
返回不具有扩展名的指定路径字符串的文件名。 public static string GetFileNameWithoutExtension( string path )
4:程序如下:
这个程序如果你不输入文件的名字的话,会把应用程序当前目录下object/的所有文件都会转换成xml文件,如果你输入相应的execl文件名字,则只会转换你输入的execl文件(可以输入多个)
我的目录结构如下::
1 using System; 2 using System.IO; 3 using System.Collections.Generic; 4 using System.Linq; 5 using System.Text; 6 using System.Threading.Tasks; 7 using Excel; 8 using System.Data; 9 using System.Xml; 10 11 namespace ClientObjectTransform 12 { 13 class Program 14 { 15 static void Main(string[] args) 16 { 17 string str; 18 Console.WriteLine("请输入Excel文件名字(可输入1个,多个,也可以不输入)::"); 19 str = Console.ReadLine(); 20 args = str.Split(' '); 21 if ( args.Length >= 1 ) 22 { 23 Console.WriteLine("你输入的文件名字为::"); 24 for (int i = 0; i < args.Length; i++) 25 { 26 Console.WriteLine(string.Format("{0}::{1}", i + 1, args[i])); 27 } 28 } 29 LoadExcelData(args); 30 } 31 32 static void LoadExcelData(string[] strFileNames) 33 { 34 //获取当前应用程序目录下的所有文件名 35 string[] strFiels = Directory.GetFiles(Directory.GetCurrentDirectory() + "/object/", "*.xls*", SearchOption.TopDirectoryOnly); 36 37 if ( strFileNames.Length >= 1 ) 38 { 39 40 foreach (string strName in strFileNames) 41 { 42 string str = Directory.GetCurrentDirectory() + "/object/"+strName + ".xlsx"; 43 //Console.Write("str file:{0}", str); 44 if (strFiels.Contains(str)) 45 { 46 LoadOneFile(str); 47 } 48 } 49 } 50 51 else 52 { 53 foreach (string strPath in strFiels) 54 { 55 if ( strPath.Length > 0 ) 56 { 57 LoadOneFile(strPath); 58 } 59 } 60 } 61 Console.Write("按任意键退出..."); 62 Console.ReadKey(true); 63 } 64 65 static void LoadOneFile(string strPath) 66 { 67 FileInfo fileinfo = new FileInfo(strPath); 68 FileStream filestream; 69 70 if (fileinfo != null) 71 { 72 filestream = fileinfo.Open(FileMode.Open, FileAccess.Read); //FileAccess::指定对文件的读取和写入访问。 73 IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(filestream); 74 filestream.Close(); 75 76 // 第二行是key 第三行是类型,所以从第四行开始读就可以 77 78 DataSet result = excelReader.AsDataSet(); 79 DataTable datatable = result.Tables[0]; 80 81 int columns = datatable.Columns.Count; //execl列 82 int rows = datatable.Rows.Count; //execl行 83 84 XmlDocument xmlDoc = new XmlDocument(); 85 XmlNode rootNode = xmlDoc.CreateElement("object"); //假如根元素 86 87 string filename = Path.GetFileNameWithoutExtension(strPath); 88 89 for (int i = 3; i < rows; i++) 90 { 91 XmlNode objectNode = xmlDoc.CreateElement(filename); 92 for (int j = 0; j < columns; j++) 93 { 94 string val = datatable.Rows[i][j].ToString(); 95 bool bErrorData = (i == 1 || i == 2 || j == 0) && val.Length == 0; 96 if (bErrorData) 97 { 98 Console.Write("file:{0} key or type is null", filename); 99 continue; 100 } 101 102 string nodeName = datatable.Rows[1][j].ToString(); 103 if (nodeName.Length == 0) 104 { 105 continue; 106 } 107 108 XmlNode objectChildNode = xmlDoc.CreateElement(nodeName); 109 110 XmlAttribute valAttr = xmlDoc.CreateAttribute("value"); //属性 111 valAttr.Value = val; 112 objectChildNode.Attributes.Append(valAttr); 113 114 XmlAttribute typeAttr = xmlDoc.CreateAttribute("type"); 115 typeAttr.Value = datatable.Rows[2][j].ToString(); 116 objectChildNode.Attributes.Append(typeAttr); 117 118 objectNode.AppendChild(objectChildNode); 119 } 120 121 rootNode.AppendChild(objectNode); 122 } 123 124 excelReader.Close(); 125 126 xmlDoc.AppendChild(rootNode); 127 128 xmlDoc.Save(Directory.GetCurrentDirectory() + "/clientobject/" + filename + ".xml"); //保存转换好的xml文件到指定目录 129 } 130 } 131 } 132 }
程序运行的结果
这样就会得到对应的xml文件了.