Несколько таблиц Excel из XML Mapping - PullRequest
1 голос
/ 17 января 2012

Я пытаюсь сгенерировать файл Excel 2007 (см. 1-е изображение ниже), используя данные о продажах в формате XML.Сложность в том, что я бы хотел диаграмму для каждого элемента <item> (см. 2-е изображение ниже).Для конечного продукта я бы построил эту логику в vba в шаблоне .xltm, который будет генерировать около 800 таблиц продаж товаров в зависимости от заданного XML.

(я много работал с Excel VBA и егосоединения таблиц запросов / рабочих книг, но я новичок в области импорта XML-данных, так что терпите меня.)

Моей первой мыслью было использование карт XML.Я надеялся, что мне удастся повторить сопоставление одного и того же элемента несколько раз, но сопоставить его с конкретными элементами <item name"x"> (все через VBA), но, похоже, это не вариант (если только это не скрытая функциональность в VBA, которой я не являюсь).в курсе?).

Я мог бы использовать различные имена элементов в качестве элементов (например, <item1>, <item2> и т. д.) вместо <item>, поэтому каждый элемент - это собственный элемент, который я бы отображал отдельно,Разве это не было бы немного хакерским?Я новичок в мире XML, и это не похоже на то, что это будет считаться правильным.Моя цель состоит в том, чтобы использовать эту же концепцию генерации «битовых диаграмм» в самых разных целях отчетности, поэтому я надеюсь найти элегантный процесс.

Похоже, мой единственный вариант - иметь взломанный XMLотображение (см. 3-е изображение ниже), где каждая диаграмма - это собственный тег элемента, затем каким-то образом выполнить итерацию и поместить диаграмму каждого элемента на лист с помощью VBA.(Не уверен, что 800 сопоставлений могли бы сделать производительность Excel)

Любой совет будет оценен по достоинству.Я думаю, что это общая потребность для опытных пользователей Excel, но мне трудно найти информацию по этой концепции.Если эта концепция возможна с другими методами (например, таблицы запросов и т. Д.), Я открыт для любого решения.Похоже, что XML лучше всего подходит для этой визуальной отчетности, в отличие от табличной.

У меня есть полный контроль над исходной XML-схемой на случай, если потребуется реструктуризация для соответствия методу.Кроме того, все данные / форматирование были упрощены ради примеров.

Пример формата отчета:
desc1

Фрагмент XMLФормат данных:
desc2

Hacky XML Mapping Method
desc3

1 Ответ

0 голосов
/ 26 апреля 2012

Я использовал что-то подобное для создания нескольких таблиц на листе, а также нескольких листов.

            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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...