Я адаптировал код, который я нашел здесь, чтобы преобразовать 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" (первый) в каждом случае, независимо от его имени? В качестве альтернативы, есть ли способ программно определить имя листа и использовать его?
Используя TableSchema
вы можете извлечь имена Worksheet с помощью OleDb.
dtSchema = conObj.GetOleDbSchemaTable( OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
If I use this line instead...
Кажется, это та же строка, что и в вашем первом примере. Я предполагаю, что это должно бытьSheet1$
в этой строке?Retrieve Data Source Structure (Metadata) from Excel