2013-07-15 11 views
6

Chcę przekonwertować kompletny plik XML na XLSX, ale nie jestem pewien, jak mogę to zrobić. Szukałem w Google rozwiązania, ale najwięcej czasu znajduję tylko w innym kierunku, na przykład XLSX do XML. Na stronie Microsoft znalazłem xmlconvertclass, ale nie jestem pewien, w jaki sposób mogę pracować z tą klasą.C# .xml do .xlsx jak?

Czy ktoś zrobił coś takiego w przeszłości i może mi pomóc?

+0

Jak o [XslCompiledTransform] (http://msdn.microsoft.com/en-us/library/system.xml.xsl.xslcompiledtransform.aspx) klasy? – rene

+0

ten link może być pomocny http://stackoverflow.com/questions/151005/create-excel-xls-and-xlsx-file-from-c-sharp –

+0

Fridolin: Sprawdź ostatnią odpowiedź – Gun

Odpowiedz

4

Wypróbuj poniższy kod, w którym przekształca XML do obiektu DataSet i później eksportowane DataSet do Excela

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

wow, utwórz klasę. A klasa działa, ale mam tylko pierwszy wiersz i pierwszą kolumnę, dlaczego? – Fridolin

+0

Powinno to działać we wszystkich wierszach. czy możesz sprawdzić, czy DataTable jest wypełniona poprawnie, czy nie przez debugowanie? – Gun

+0

@Fridolin BTW, jeśli otrzymasz odpowiedź, oznacz ją jako poprawną – Gun

1

Należy przeczytać schema dla formatu pliku XLSX i napisać plik XSLT, aby przekształcić niestandardowy plik XML.

.NET ma bardzo dobrą obsługę XML, więc coś takiego powinno być dość trywialne, będzie to rzeczywiste mapowanie z formatu XML na XSLT, gdzie wymagany jest prawdziwy wysiłek.

2

O wiele prostsze rozwiązanie: wykorzystuj źródła danych w programie Excel.

  1. Utwórz "szablon" Xslx, który odpowiada Twoim potrzebom.
  2. Dla każdego pliku danych xml dodaj połączenie danych do pliku xml.
  3. Skonfiguruj, jeśli chcesz, połączenie danych, aby odświeżyć przy każdym otwarciu pliku.

To działa fabrycznie, bez kodu (wyłączając oczywiście generację xml).

Opcjonalnie możesz opublikować swój Xml za pośrednictwem aplikacji ASP.Net (dynamicznie lub nie) i skonfigurować połączenie danych, aby zebrać dane z tej aplikacji asp.net.

+0

Najprzyjemniejszym sposobem dla mnie było: Otwórz go w programie Excel i zapisz jako .xlsx, ale problem polega na tym, że czasami mam więcej niż 1 XML i powtarzam te kroki ... Potrzebuję rozwiązania jednego kliknięcia: // – Fridolin

+0

Otocz moje kroki "dla każdego źródło xml ". To będzie nadal ważne. Szablon jest generowany ** raz **. Tylko dane XML są dynamiczne. –

0

skorzystaj z poniższego kodu jeśli otrzymujesz wiele tabel ze zbioru danych i należy dbać o logice wstawianie tabel danych do Excela.

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

    } 
+0

Hej dziękuję za to, działa lepiej niż pierwszy, ale mam jeden problem, kiedy Wiersz 1 i 2 mają tę samą zawartość w kolumna nie wyświetla informacji w następnym wierszu/kolumnie ... – Fridolin

+0

Brak rozwiązania w końcu? : / – Fridolin