Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XML映射中的多个Excel表_Xml_Excel_Vba_Reporting - Fatal编程技术网

XML映射中的多个Excel表

XML映射中的多个Excel表,xml,excel,vba,reporting,Xml,Excel,Vba,Reporting,我正在尝试使用XML格式的销售数据生成一个Excel 2007文件,请参见下面的第一张图片。棘手的部分是我想要一张每个元素的图表,见下图2。对于最终产品,我将在vba中的.xltm模板中构建此逻辑,该模板将根据给定的XML生成大约800个商品销售表 我曾多次使用ExcelVBA及其查询表/工作簿连接,但我对数据导入的XML方面还不熟悉,请耐心等待 我的第一个想法是使用XML映射。我希望能够多次复制相同的元素映射,但通过VBA将其映射到特定的元素,但这似乎不是一个选项,除非它是VBA中我不知道的隐

我正在尝试使用XML格式的销售数据生成一个Excel 2007文件,请参见下面的第一张图片。棘手的部分是我想要一张每个元素的图表,见下图2。对于最终产品,我将在vba中的.xltm模板中构建此逻辑,该模板将根据给定的XML生成大约800个商品销售表

我曾多次使用ExcelVBA及其查询表/工作簿连接,但我对数据导入的XML方面还不熟悉,请耐心等待

我的第一个想法是使用XML映射。我希望能够多次复制相同的元素映射,但通过VBA将其映射到特定的元素,但这似乎不是一个选项,除非它是VBA中我不知道的隐藏功能

我可以使用不同的项目名称作为元素,例如,等等,而不是,因此每个项目都是我单独映射的自己的元素。这不是有点骇人吗?我是XML世界的新手,这听起来不像是格式良好的。我的目标是在许多不同的报告目的上使用相同的概念生成位大小的图表,所以我希望找到一个优雅的过程

似乎我唯一的选择是使用一个粗糙的XML映射(参见下面的第3幅图),其中每个图表都是它自己的元素标记,然后用VBA迭代并将每个元素的图表放在工作表上。不确定800个映射对Excel的性能有何影响

任何建议都将不胜感激。我认为这是Excel超级用户的共同需求,但我很难找到关于这个概念的信息。如果这个概念可以通过其他方法实现,如查询表等,我愿意接受任何解决方案。似乎XML最适合这种可视化样式的报告,而不是表格样式的报告

我可以完全控制源XML模式,以防它需要重新构造以适应方法。此外,为了举例说明,所有数据/格式都被简化了

报告格式示例:

XML数据格式的片段:

Hacky-XML映射方法

我使用类似的方法在一个工作表中创建多个表以及多个工作表

            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();