Как безопасно преобразовать лист XLS в файл XML, не зная имени листа файла XLS?

1

Я адаптировал код, который я нашел здесь, чтобы преобразовать XLS в XML следующим образом:

try
{
    System.Data.OleDb.OleDbConnection MyConnection;
    System.Data.DataSet ds;
    System.Data.OleDb.OleDbDataAdapter MyCommand;
    String fullFilePath = @"C:\worldSeries2014\baltimoreOrioles.xls";
    MyConnection = new 
   System.Data.OleDb.OleDbConnection(String.Format("provider=Microsoft.Jet.OLEDB.4.0;Data 
   Source='{0}';Extended Properties=Excel 8.0;", fullFilePath));
    MyCommand = new System.Data.OleDb.OleDbDataAdapter("select * from [Sheet0$]", 
      MyConnection);
    MyCommand.TableMappings.Add("Table", "Product"); // I don't know what this does
    ds = new System.Data.DataSet();
    MyCommand.Fill(ds);
    MyConnection.Close();
    ds.WriteXml(@"C:\MiscellaneousJones\os.xml");
}
catch (Exception ex)
{
    MessageBox.Show(ex.ToString());
} 

Это работает (файл xml создается с данными из первого листа в файле xls), если загруженный файл.xls имеет лист с именем "Sheet0",

Если я использую эту строку вместо этого (это то, к чему я начал использовать код примера):

MyCommand = new System.Data.OleDb.OleDbDataAdapter("select * from [Sheet1$]", MyConnection);

... Я получаю: "Sheet1 $ не является допустимым именем. Убедитесь, что он не содержит недопустимых символов или знаков препинания и что он не слишком длинный",

Знак доллара, по-видимому, необходим, как будто я использую это:

MyCommand = new System.Data.OleDb.OleDbDataAdapter("select * from [Sheet0]", MyConnection);

... Я понимаю: "Механизм базы данных Microsoft Jet не смог найти объект" Sheet0 "

Итак, могу ли я полагаться на "Sheet0", всегда являющийся именем листа для преобразования? Я уверен, что не могу, так как я могу использовать "лист 0" (первый) в каждом случае, независимо от его имени? В качестве альтернативы, есть ли способ программно определить имя листа и использовать его?

  • 1
    If I use this line instead... Кажется, это та же строка, что и в вашем первом примере. Я предполагаю, что это должно быть Sheet1$ в этой строке?
  • 1
    Также эта ссылка может помочь, если вы хотите получить имена листов в файле Excel. Это также см. В разделе « Retrieve Data Source Structure (Metadata) from Excel
Показать ещё 1 комментарий
Теги:
xls
oledb
oledbconnection
oledbdataadapter

1 ответ

1
Лучший ответ

Используя TableSchema вы можете извлечь имена Worksheet с помощью OleDb.

dtSchema = conObj.GetOleDbSchemaTable( OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });

Ещё вопросы

Сообщество Overcoder
Наверх
Меню