在我们的工作中可能会需要到让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文件(可以输入多个)
我的目录结构如下::
using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Excel;
using System.Data;
using System.Xml; namespace ClientObjectTransform
{
class Program
{
static void Main(string[] args)
{
string str;
Console.WriteLine("请输入Excel文件名字(可输入1个,多个,也可以不输入)::");
str = Console.ReadLine();
args = str.Split(' ');
if ( args.Length >= )
{
Console.WriteLine("你输入的文件名字为::");
for (int i = ; i < args.Length; i++)
{
Console.WriteLine(string.Format("{0}::{1}", i + , args[i]));
}
}
LoadExcelData(args);
} static void LoadExcelData(string[] strFileNames)
{
//获取当前应用程序目录下的所有文件名
string[] strFiels = Directory.GetFiles(Directory.GetCurrentDirectory() + "/object/", "*.xls*", SearchOption.TopDirectoryOnly); if ( strFileNames.Length >= )
{ foreach (string strName in strFileNames)
{
string str = Directory.GetCurrentDirectory() + "/object/"+strName + ".xlsx";
//Console.Write("str file:{0}", str);
if (strFiels.Contains(str))
{
LoadOneFile(str);
}
}
} else
{
foreach (string strPath in strFiels)
{
if ( strPath.Length > )
{
LoadOneFile(strPath);
}
}
}
Console.Write("按任意键退出...");
Console.ReadKey(true);
} static void LoadOneFile(string strPath)
{
FileInfo fileinfo = new FileInfo(strPath);
FileStream filestream; if (fileinfo != null)
{
filestream = fileinfo.Open(FileMode.Open, FileAccess.Read); //FileAccess::指定对文件的读取和写入访问。
IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(filestream);
filestream.Close(); // 第二行是key 第三行是类型,所以从第四行开始读就可以 DataSet result = excelReader.AsDataSet();
DataTable datatable = result.Tables[]; int columns = datatable.Columns.Count; //execl列
int rows = datatable.Rows.Count; //execl行 XmlDocument xmlDoc = new XmlDocument();
XmlNode rootNode = xmlDoc.CreateElement("object"); //假如根元素 string filename = Path.GetFileNameWithoutExtension(strPath); for (int i = ; i < rows; i++)
{
XmlNode objectNode = xmlDoc.CreateElement(filename);
for (int j = ; j < columns; j++)
{
string val = datatable.Rows[i][j].ToString();
bool bErrorData = (i == || i == || j == ) && val.Length == ;
if (bErrorData)
{
Console.Write("file:{0} key or type is null", filename);
continue;
} string nodeName = datatable.Rows[][j].ToString();
if (nodeName.Length == )
{
continue;
} XmlNode objectChildNode = xmlDoc.CreateElement(nodeName); XmlAttribute valAttr = xmlDoc.CreateAttribute("value"); //属性
valAttr.Value = val;
objectChildNode.Attributes.Append(valAttr); XmlAttribute typeAttr = xmlDoc.CreateAttribute("type");
typeAttr.Value = datatable.Rows[][j].ToString();
objectChildNode.Attributes.Append(typeAttr); objectNode.AppendChild(objectChildNode);
} rootNode.AppendChild(objectNode);
} excelReader.Close(); xmlDoc.AppendChild(rootNode); xmlDoc.Save(Directory.GetCurrentDirectory() + "/clientobject/" + filename + ".xml"); //保存转换好的xml文件到指定目录
}
}
}
}
程序运行的结果
这样就会得到对应的xml文件了.