来自XML映射的多个Excel表

我正在尝试使用XML中的销售数据生成Excel 2007文件(请参见下面的第一张图)。 棘手的部分是我想每个<item>元素的图表(见下面的第二张图片)。 对于最终产品,我会在.xltm模板中使用vba构build这个逻辑,根据给定的XML,将生成大约800个产品销售表。

(我已经与Excel VBA和它的查询表/工作簿连接了很多,但我是新来的XML数据导入方面,所​​以忍受着我。)

我的第一个想法是使用XML地图。 我希望能够多次复制相同的元素映射,但将其映射到特定的<item name"x">元素(全部通过VBA),但它看起来像那不是一个选项(除非它在VBA中的隐藏function我不知道?)。

我可以使用不同的项目名称作为元素(即<item1><item2>等)而不是<item> ,所以每个项目都是我自己的元素,我会分开映射。 这不是有点哈克吗? 我是XML世界的新手,这听起来不像是被认为是完美的。 我的目标是使用这个相同的概念来生成“比特大小的图表”在许多不同的报告目的,所以我希望find一个优雅的过程。

看起来像我唯一的select是有一个黑客的XML映射(见下面的第三张图片),其中每个图表是它自己的元素标记,然后以某种方式迭代和放置每个元素的图表与VBA的工作表。 (不知道什么800映射会做Excel的性能)

任何意见将不胜感激。 我认为这是Excel高级用户的普遍需求,但是我很难find关于这个概念的信息。 如果这个概念是可能的其他方法(即查询表等),我打开任何解决scheme。 XML似乎是最适合这种视觉风格的报告,而不是表格式的报告。

如果需要重新编译以适应方法,我完全控制源XML模式。 而且,为了举例,所有的数据/格式都已经被忽略了。

报告格式示例:
DESC1

XML数据格式片段:
DESC2

Hacky XML映射方法
desc3

我已经使用这样的东西来创build表中的多个表以及多个表

  var data = Collection1; var data1 = Collection2; var name = "sheet name"; const int left = 1; const int top = 3; int height = data.GetLength(0); int width = data.GetLength(1); int bottom = top + height - 1; int right = left + width - 1; var exxapp = new Microsoft.Office.Interop.Excel.Application(); Workbook xlWorkBook = exxapp.Workbooks.Add(Missing.Value); var xlWorkSheet = (Worksheet)xlWorkBook.Sheets.Item[1]; xlWorkSheet.Name = "sheet name"; exxapp.ScreenUpdating = false; if (height == 0 || width == 0) return; dynamic rgtitle = xlWorkSheet.Range[xlWorkSheet.Cells[1, 1], xlWorkSheet.Cells[1, 1]]; rgtitle.Value = "Table Heading :- " + name; rgtitle.EntireColumn.AutoFit(); dynamic rg = xlWorkSheet.Range[xlWorkSheet.Cells[top, left], xlWorkSheet.Cells[bottom, right]]; rg.Value = data; // Set borders for (int i = 1; i <= 4; i++) rg.Borders[i].LineStyle = 1; // Set auto columns width rg.EntireColumn.AutoFit(); // Set header view dynamic rgHeader = xlWorkSheet.Range[xlWorkSheet.Cells[top, left], xlWorkSheet.Cells[top, right]]; rgHeader.Font.Bold = true; rgHeader.Interior.Color = 189 * (int)Math.Pow(16, 4) + 129 * (int)Math.Pow(16, 2) + 78; // #4E81BD const int left1 = 1; const int top1 = 1; int height1 = data1.GetLength(0); int width1 = data1.GetLength(1); int bottom1 = top1 + height1 - 1; int right1 = left1 + width1 - 1; xlWorkSheet = (Worksheet)xlWorkBook.Sheets.Item[2]; xlWorkSheet.Name = "second sheet name"; exxapp.ScreenUpdating = false; if (height1 == 0 || width1 == 0) return; dynamic rg1 = xlWorkSheet.Range[xlWorkSheet.Cells[top1, left1], xlWorkSheet.Cells[bottom1, right1]]; rg1.Value = data1; // Set borders for (int i = 1; i <= 4; i++) rg1.Borders[i].LineStyle = 1; // Set auto columns width rg1.EntireColumn.AutoFit(); // Set header view dynamic rgHeader1 = xlWorkSheet.Range[xlWorkSheet.Cells[top1, left1], xlWorkSheet.Cells[top1, right1]]; rgHeader1.Font.Bold = true; rgHeader1.Interior.Color = 189 * (int)Math.Pow(16, 4) + 129 * (int)Math.Pow(16, 2) + 78; // #4E81BD // Show excel app exxapp.ScreenUpdating = true; exxapp.Visible = true; Marshal.ReleaseComObject(rg); Marshal.ReleaseComObject(rgHeader); Marshal.ReleaseComObject(rg1); Marshal.ReleaseComObject(rgHeader1); Marshal.ReleaseComObject(xlWorkSheet); Marshal.ReleaseComObject(xlWorkBook); Marshal.ReleaseComObject(exxapp); GC.Collect();