我想将一个完整的 XML 文件转换为 XLSX,但我不确定该怎么做。 我在谷歌上搜索了一个解决方案,但大多数时候我只能找到另一个方向的方法,例如 XLSX 到 XML。 在 Microsoft 页面上,我找到了一个 xmlconvertclass,但我不确定如何使用该类。
过去有人做过这样的事情可以帮助我吗?
尝试下面的代码,我将 XML 转换为 DataSet,然后将 DataSet 导出到 Excel
DataSet ds = new DataSet();
//Convert the XML into Dataset
ds.ReadXml(@"E:\movie.xml");
//Retrieve the table fron Dataset
DataTable dt = ds.Tables[0];
// Create an Excel object
Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
//Create workbook object
string str = @"E:\test.xlsx";
Microsoft.Office.Interop.Excel.Workbook workbook = excel.Workbooks.Open(Filename: str);
//Create worksheet object
Microsoft.Office.Interop.Excel.Worksheet worksheet = workbook.ActiveSheet;
// Column Headings
int iColumn = 0;
foreach (DataColumn c in dt.Columns)
{
iColumn++;
excel.Cells[1, iColumn] = c.ColumnName;
}
// Row Data
int iRow = worksheet.UsedRange.Rows.Count - 1;
foreach (DataRow dr in dt.Rows)
{
iRow++;
// Row's Cell Data
iColumn = 0;
foreach (DataColumn c in dt.Columns)
{
iColumn++;
excel.Cells[iRow + 1, iColumn] = dr[c.ColumnName];
}
}
((Microsoft.Office.Interop.Excel._Worksheet)worksheet).Activate();
//Save the workbook
workbook.Save();
//Close the Workbook
workbook.Close();
// Finally Quit the Application
((Microsoft.Office.Interop.Excel._Application)excel).Quit();
更简单的解决方案:在 Excel 中使用数据源。
这是开箱即用的,根本没有代码(当然不包括 xml 生成)。
您可以选择通过 ASP.Net 应用程序(动态或非动态)发布您的 Xml,并设置数据连接以从该 ASP.NET 应用程序收集数据。
您需要阅读 XLSX 文件格式的 schema 并编写 XSLT 文件来转换您的自定义 XML 文件。
.NET 有很好的 XML 支持,所以像这样的事情应该是相当微不足道的,它将是从 XML 格式到 XSLT 的实际映射,需要真正的努力。
如果您从数据集中获取多个表,请使用下面的代码,您应该注意将数据表插入 excel 的逻辑。
static void Main(string[] args)
{
DataSet ds = new DataSet();
//Convert the XML into Dataset
ds.ReadXml(@"E:\movies.xml");
//Retrieve the table fron Dataset
//DataTable dt = ds.Tables[0];
// Create an Excel object
Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
//Create workbook object
string str = @"E:\test.xlsx";
Microsoft.Office.Interop.Excel.Workbook workbook = excel.Workbooks.Open(Filename: str);
foreach (DataTable tab in ds.Tables)
{
FromDataTableToExcel(tab,excel,workbook);
}
//Save the workbook
workbook.Save();
//Close the Workbook
workbook.Close();
// Finally Quit the Application
((Microsoft.Office.Interop.Excel._Application)excel).Quit();
}
static void FromDataTableToExcel(DataTable dt, Microsoft.Office.Interop.Excel.Application excel, Microsoft.Office.Interop.Excel.Workbook workbook)
{
//Create worksheet object
Microsoft.Office.Interop.Excel.Worksheet worksheet = workbook.ActiveSheet;
// Column Headings
int iColumn = worksheet.UsedRange.Columns.Count-1;
int iColumn1 = iColumn;
int iColumn2 = iColumn;
foreach (DataColumn c in dt.Columns)
{
iColumn++;
excel.Cells[1, iColumn] = c.ColumnName;
}
// Row Data
int iRow = 0;
foreach (DataRow dr in dt.Rows)
{
iRow++;
// Row's Cell Data
foreach (DataColumn c in dt.Columns)
{
iColumn1++;
excel.Cells[iRow + 1, iColumn1] = dr[c.ColumnName];
}
iColumn1 = iColumn2;
}
((Microsoft.Office.Interop.Excel._Worksheet)worksheet).Activate();
}
以防有人需要在没有 Microsoft Excel 的情况下将 XML(表格数据)文件转换为 XLSX。下面是 NPOI + C# 解决方案....
示例 XML(表格数据):
<rows>
<row>
<col_1>a</col_1>
<col_2>b</col_2>
<col_3>c</col_3>
<col_4>d</col_4>
<col_5>e</col_5>
</row>
<row>
<col_1>f</col_1>
<col_2>h</col_2>
<col_3>h</col_3>
<col_4>i</col_4>
<col_5>j</col_5>
</row>
<row>
<col_1>k</col_1>
<col_2>l</col_2>
<col_3>m</col_3>
<col_4>n</col_4>
<col_5>o</col_5>
</row>
</rows>
C#代码:
class clsNpoi
{
public static bool convert_xml_to_xlsx(string xml_path, string row_element_name)
{
try
{
//load xml
XElement elem = XElement.Load(xml_path);
if (elem.XPathSelectElements(row_element_name).Count() == 0)
{
return false; // exit if no row elements are found
}
else
{
//process;
string xpath_text = "//" + row_element_name;
XSSFWorkbook wb = new XSSFWorkbook();
XSSFSheet sh = (XSSFSheet)wb.CreateSheet(Path.GetFileNameWithoutExtension(xml_path));
//get column heads;
var heading_items = elem.XPathSelectElements(xpath_text).First().Elements().Select(e => e.Name.LocalName).Distinct().ToArray();
//get row items;
var row_elems = elem.XPathSelectElements("//" + row_element_name).ToArray();
int row_index = 0, col_index = 0;
foreach (XElement row_elem in row_elems)
{
sh.CreateRow(row_index);
if (row_index == 0)
{
foreach (string heading_item in heading_items)
{
sh.GetRow(row_index).CreateCell(col_index);
sh.GetRow(row_index).GetCell(col_index).SetCellValue(heading_item);
sh.AutoSizeColumn(col_index);
col_index++;
}
row_index++; col_index = 0;
sh.CreateRow(row_index);
}
for (col_index = 0; col_index < heading_items.Count(); col_index++)
{
sh.GetRow(row_index).CreateCell(col_index);
//discard blank / null values -- set "-" as default !important step
var content_value = (string.IsNullOrEmpty(row_elem.Element(heading_items[col_index]).Value) || string.IsNullOrWhiteSpace(row_elem.Element(heading_items[col_index]).Value)) ? "-" : row_elem.Element(heading_items[col_index]).Value;
sh.GetRow(row_index).GetCell(col_index).SetCellValue(content_value);
}
row_index++; col_index = 0;
}
FileStream fs = new FileStream(Path.ChangeExtension(xml_path, ".xlsx"), FileMode.Create, FileAccess.Write);
wb.Write(fs);
fs.Close();
wb.Clear();
return true;
}
}
catch (Exception ex)
{
Debug.Print(ex.ToString());
return false;
}
}
调用
clsNpoi.convert_xml_to_xlsx(<xml_path>, "row");
,结果...
对于 java 用法,请访问 HSSF 和 XSSF 功能繁忙的开发人员指南
对于 c# 用法,请访问 nissl-lab / npoi
希望这对某人有帮助:)