С# .xml в .xlsx как?

Я хочу преобразовать полный XML-файл в XLSX, но не знаю, как это сделать. Я искал в Google решения, но в большинстве случаев я нахожу путь только в другом направлении, например, XLSX в XML. На странице Microsoft я нашел xmlconvertclass, но я не уверен, как я могу работать с классом.

Кто-то делал что-то подобное в прошлом и может мне помочь?


person Fridolin    schedule 15.07.2013    source источник
comment
Как насчет класса XslCompiledTransform?   -  person rene    schedule 15.07.2013
comment
эта ссылка может быть полезна stackoverflow.com/questions/151005/   -  person Vano Maisuradze    schedule 15.07.2013
comment
Фридолин: Пожалуйста, проверьте недавний ответ   -  person Gun    schedule 16.07.2013


Ответы (4)


Попробуйте приведенный ниже код, в котором я преобразовал 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();
person Gun    schedule 15.07.2013
comment
вау, создай класс. И класс работает, но я получаю только первую строку и первый столбец, почему? - person Fridolin; 15.07.2013
comment
Это должно работать для всех строк. Вы можете проверить правильность заполнения DataTable путем отладки? - person Gun; 15.07.2013
comment
Заполняется первой строкой и столбцом, хм. Но у меня есть 30 столбцов и 5 строк в тестовом XML. - person Fridolin; 15.07.2013
comment
Можете ли вы опубликовать свой XML? - person Gun; 15.07.2013
comment
Я не знаю, как я могу размещать файлы данных здесь... :/? - person Fridolin; 15.07.2013
comment
Отредактируйте свой вопрос и добавьте свой формат XML к своему вопросу. - person Gun; 15.07.2013
comment
не нашел функцию добавления, вот ссылка dateiupload.net/ - person Fridolin; 15.07.2013
comment
вы получаете более 1 таблицы из набора данных, поэтому вы должны зацикливать все таблицы данных - person Gun; 16.07.2013

Гораздо более простое решение: использовать источники данных в Excel.

  1. Создайте «шаблон» Xslx, который соответствует вашим потребностям.
  2. Для каждого файла данных xml добавьте подключение к данным в файл xml.
  3. Настройте, если хотите, чтобы подключение к данным обновлялось при каждом открытии файла.

Это работает «из коробки», вообще без кода (за исключением, конечно, генерации xml).

При желании вы можете опубликовать свой Xml через приложение ASP.Net (динамически или нет) и настроить подключение к данным для сбора данных из этого приложения asp.net.

person Steve B    schedule 15.07.2013
comment
Самый простой способ для меня: открыть его с помощью Excel и сохранить как .xlsx, но проблема в том, что иногда у меня есть более 1 XML, и я повторяю эти шаги... мне нужно решение в один клик для этого: // - person Fridolin; 15.07.2013
comment
Окружите мои шаги для каждого источника xml. Это все еще будет в силе. Шаблон создается один раз. Только данные xml являются динамическими. - person Steve B; 15.07.2013

Вам нужно будет прочитать схему. для формата файла XLSX и напишите файл XSLT для преобразования вашего пользовательского файла XML.

.NET имеет очень хорошую поддержку XML, поэтому что-то вроде этого должно быть довольно тривиальным, это будет фактическое сопоставление вашего формата XML с XSLT, где требуются реальные усилия.

person James    schedule 15.07.2013

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

    }
person Gun    schedule 16.07.2013
comment
Эй, спасибо за это, это работает лучше, чем первое, но у меня есть одна проблема, когда строки 1 и 2 имеют одинаковый контент в столбце, он не показывает информацию в следующей строке/столбце... - person Fridolin; 17.07.2013
comment
Наконец-то нет решения? :/ - person Fridolin; 13.08.2013