2013-05-29 2 views
1

после исследования последних трех дней и составления избитой версии конвертера Excel-to-XML, пришло время обратиться за помощью к форуму, потому что я не могу получить именно то, что мне нужно. Здесь есть хороший код, поэтому любой, кому это нужно, может его схватить.Преобразование сложного Excel в XML

У меня есть два преобразователя: 1) Excel-to-XML (в VB) и 2) XML-to-Excel (на C# ниже). Последний успешно создает функциональный файл Excel, хотя тот, который не будет преобразовывать обратно как хорошо сформированный XML.

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

Исходный образец XML файл:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<Data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:noNamespaceSchemaLocation="practice.xsd"> 
<Person> 
    <FirstName>Oscar</FirstName> 
    <LastName>Banda</LastName> 
</Person> 
<Person> 
    <FirstName>Steven</FirstName> 
    <LastName>Richter</LastName> 
</Person> 
<Person> 
    <FirstName>Luis</FirstName> 
    <LastName>Contreras</LastName> 
</Person> 
<Person> 
    <FirstName>Elias</FirstName> 
    <LastName>Cooper</LastName> 
</Person> 
</Data> 

Это превращает в две колонок Excel файла с заголовками столбцов для первых и фамилий, но без признания тегов и в любом месте. Таким образом, в другую сторону получает меня (также обратите внимание на неправильные имена элементов и странные форматы именования):

<?xml version="1.0" standalone="yes"?> 
    <NewDataSet> 
    <Your> 
    <First_x0020_Name>Oscar</First_x0020_Name> 
    <Last_x0020_Name>Banda</Last_x0020_Name> 
    </Your> 
    <Your> 
    <First_x0020_Name>Elias</First_x0020_Name> 
    <Last_x0020_Name>Cooper</Last_x0020_Name> 
    </Your> 
    <Your> 
    <First_x0020_Name>Steven</First_x0020_Name> 
    <Last_x0020_Name>Richter</Last_x0020_Name> 
    </Your> 
    <Your> 
    <First_x0020_Name>Luis</First_x0020_Name> 
    <Last_x0020_Name>Contreras</Last_x0020_Name> 
    </Your> 
</NewDataSet> 

В.Б. Я использую следующие:

Public Function ExcelToXMLConverter(excelFile As String) 
    Dim MyConnection As System.Data.OleDb.OleDbConnection 
    Dim ds As System.Data.DataSet 
    Dim MyCommand As System.Data.OleDb.OleDbDataAdapter 
    Dim source As String = excelFile 
    Dim connectionString As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & source & ";Extended Properties=Excel 12.0;" 

    'get Table Name 
    MyConnection = New System.Data.OleDb.OleDbConnection(connectionString) 
    MyCommand = New System.Data.OleDb.OleDbDataAdapter("select * from [Practice$]", MyConnection) 
    MyCommand.TableMappings.Add("Table", "Your") 

    'Fill dataset with the data 
    ds = New System.Data.DataSet() 
    MyCommand.Fill(ds) 
    ds.WriteXml(IO.Path.GetDirectoryName(source).ToString() & "\" & IO.Path.GetFileNameWithoutExtension(source) & ".xml") 
    MyConnection.Close() 

    Return (ds) 
End Function 

Это, вероятно, есть что-то делать с функцией MyCommand.TableMappings.Add, но я не уверен, как сделать эту работу без использования строк, которые у меня уже есть.

EDIT: Теперь я понимаю, что «ваш» в tablemappings.add должен быть заменен на «Person», чтобы получить правильные имена элементов, но это не объясняет, почему элементы «First/Last Name» возвращаются в странном формате. Я бы не стал жестко программировать эту строку.

Кроме того, задаваясь вопросом, как я могу получить это программное обеспечение, я включаю в себя мой конвертер XML-to-Excel (на C#), чтобы узнать, может ли кто-нибудь предложить способ включения элементов и в полученный файл Excel что когда я конвертирую другой путь, Excel-to-XML, я получаю исходный документ.

public String XMLtoExcel(string xmlInputFile) 
    { 
     object misValue = System.Reflection.Missing.Value; 
     // create Excel 
     Excel.Application myApp = new Excel.Application(); 
     Excel.Workbook myWbk = myApp.Workbooks.Add(misValue); 
     Excel.Worksheet myWst = (Excel.Worksheet)myWbk.Worksheets.get_Item(1); 

     // load xml file 
     string input = xmlInputFile; 
     DataSet ds = new DataSet(); 
     XmlReader xmlFile; 
     XmlReaderSettings settings = new XmlReaderSettings(); 
     settings.DtdProcessing = DtdProcessing.Parse; 
     xmlFile = XmlReader.Create(input, settings); 
     ds.ReadXml(xmlFile); 

     // write root into excel 
     //XmlDocument doc = new XmlDocument(); 
     //doc.Load(input); 
     //XmlNode root = doc.DocumentElement; 
     //myWst.Cells[1, 1] = root.Name; 

     // write data in to excel 
     int col, row; 
     int i = 1; 
     int counter = ds.Tables[0].Columns.Count; 
     for (col = 0; col <= ds.Tables[0].Columns.Count - 1; col++) 
     { 
      myWst.Cells[1, i].value = ds.Tables[0].Columns[col].ColumnName; 
      myWst.Cells[1, i].EntireRow.Font.Bold = true; 
      i += 1; 
     } 

     i = 2; 

     int k = 1; 
     for (col = 0; col <= ds.Tables[0].Columns.Count - 1; col++) 
     { 
      i = 2; 
      for (row = 0; row <= ds.Tables[0].Rows.Count - 1; row++) 
      { 
       myWst.Cells[i, k].Value = ds.Tables[0].Rows[row].ItemArray[col]; 
       i += 1; 
      } 
      k += 1; 
     } 
} 
+0

Я отредактировал ваше название. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –

ответ

0

Заголовок столбца для электронной таблицы Excel содержит пробелы в именах, таких как «Имя». (0020 - код ascii для пробела). Когда вы запрашиваете эти столбцы из excel, вы должны их псевдонизировать без пробела. Попробуйте этот код VB:

'get Table Name 
MyConnection = New System.Data.OleDb.OleDbConnection(connectionString) 
MyCommand = New System.Data.OleDb.OleDbDataAdapter("select [First Name] AS FirstName, [Last Name] AS LastName from [Practice$]", MyConnection) 
MyCommand.TableMappings.Add("Table", "Person") 'You already figured this one out 
+0

Есть ли способ удалить пробелы, а «Человек» - программно? – user

+0

В моем запросе (см. Выше) псевдонимы имен столбцов для удаления пробелов и отображения таблицы «Человек» уже было выяснено вами. Вы имеете в виду, что по какой-то причине вы не хотите использовать запрос для псевдонимов столбцов по запросу? – tgolisch

+0

Спасибо, кстати. Что я имел в виду, так это то, что я предпочитаю не писать «select [First Name] ...», потому что, вероятно, я буду добавлять другие столбцы и хочу, чтобы все они вышли без пробелов. Выполнение этого так, как вы предложили, может оказаться довольно сложной задачей, если есть много столбцов. – user