我们有一个应用程序,它使用Microsoft Access数据库引擎从Excel xlsx文件中读取数据。 xlsx文件由第三方软件生成。该应用程序已经运行多年。
生成xlsx文件的公司修改了他们的软件,结果是xlsx文件的格式发生了变化。我们的应用程序无法再读取这些文件。 但是,如果我使用Excel手动打开其中一个文件,并立即点击“保存”,新文件就可以正常工作。
来自第三方的响应基本上是#34;由于您可以使用Excel打开文件,因此显示它是有效的xlsx文件。问题必须在你的最后#34;。他们确实有一点意义。
我已在https://drive.google.com/file/d/0B6jNYMkptFteTmc4YU9BWU1PRUk/edit?usp=sharing
发布了其中一个xlsx文件的示例这是一个简单的测试程序(VisualStudio.net中的控制台应用程序),可以重现问题。
static void Main(string[] args)
{
String fileSpec = @"C:\Temp\TestData-Original.xlsx";
String connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileSpec + ";Extended Properties=\"Excel 12.0;HDR=No;IMEX=1\"";
DataTable dtExcelRecords = null;
OleDbConnection con = new OleDbConnection(connectionString);
OleDbCommand cmd = new OleDbCommand();
cmd.CommandType = System.Data.CommandType.Text;
cmd.Connection = con;
OleDbDataAdapter dAdapter = new OleDbDataAdapter(cmd);
try
{
con.Open(); // Throws exception here.
DataTable dtExcelSheetNames = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
String sheetName = (dtExcelSheetNames.Rows[0]["Table_Name"].ToString()).Replace("''", "'");
if (!(String.IsNullOrEmpty(sheetName)))
{
cmd.CommandText = "SELECT * FROM [" + sheetName + "]";
dtExcelRecords = new DataTable();
dAdapter.SelectCommand = cmd;
dAdapter.Fill(dtExcelRecords);
}
con.Close();
Console.WriteLine(String.Format("Found {0} records in file {1}", dtExcelRecords.Rows.Count, fileSpec));
}
catch (Exception ex)
{
Console.WriteLine("Exception: " + ex.Message);
}
finally
{
Console.WriteLine("Press any key to exit");
Console.ReadKey();
}
}
如果使用示例Excel文件运行此程序,它将失败。 如果您在Excel中打开示例文件,然后单击'保存',然后运行该程序,它将成功读取该文件。
测试程序做出两个假设:(1)xlsx文件位于C:\ Temp \ TestData-Original.xlsx和(2)Microsoft Access数据库引擎安装在您的计算机上。
我研究了这个,但没有运气。大多数讨论围绕更改连接字符串以指定不同版本的Excel。到目前为止,没有任何改变。
注意:我注意到当我使用Excel打开文件然后保存它时,大小增加了大约70%。
有什么想法吗?
答案 0 :(得分:0)
我使用ClosedXML(OpenXML的包装器)没有问题。
string fileSpec = @"C:\Temp\TestData-Original.xlsx";
var wb = new XLWorkbook(fileSpec);
var ws = wb.Worksheet("Sheet1");
MessageBox.Show(ws.RowCount().ToString());