2014-09-19 97 views
-1

我們有一個應用程序使用Microsoft Access數據庫引擎從Excel xlsx文件中讀取數據。 xlsx文件由第三方軟件生成。該應用程序多年來一直運行良好。程序在Excel中保存之前無法讀取xlsx文件

生成xlsx文件的公司修改了他們的軟件,結果xlsx文件的格式發生了變化。我們的應用程序不能再讀取這些文件。 但是,如果我使用Excel手動打開這些文件中的一個,並立即單擊「保存」,新文件將正常工作。

第三方的迴應基本上是「既然你可以使用Excel打開文件,那麼這表明它是一個有效的xlsx文件,問題必須在你的一端」。他們確實有一點。

我已經發布這些XLSX文件之一的樣品,在https://drive.google.com/file/d/0B6jNYMkptFteTmc4YU9BWU1PRUk/edit?usp=sharing

這裏是重現該問題的簡單測試程序(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中打開示例文件,然後單擊「保存」,然後運行該程序,它將成功讀取文件。

該測試程序做出2個假設:(1)xlsx文件位於C:\ Temp \ TestData-Original.xlsx和(2)Microsoft Access數據庫引擎安裝在您的計算機上。

我研究過這個,但沒有運氣。大多數討論圍繞改變連接字符串來指定不同版本的Excel。到目前爲止,沒有任何改變。

注意:我注意到當我使用Excel打開文件,然後保存它時,大小增加了大約70%。

任何想法?

+1

'如果你用示例Excel文件運行這個程序,它將會失敗。它是如何失敗的?它是否有例外?如果是這樣,那是什麼?它說什麼?如果在調試器中單步執行代碼會發生什麼情況? – 2014-09-19 17:08:31

+1

第三方可以爲您提供* exact *文件格式嗎?如你所想,「Excel文件」有點模糊。 Excel可以打開純文本文件,但很難證明純文本是有效的xlsx文件。如果在純文本編輯器中打開前後文件,它們是否有一些指定格式信息的內部XML? – David 2014-09-19 17:08:46

+2

你做過一個比較前的文件嗎?理論上,如果你在excel中沒有做任何事情,只是將其再次保存,文件應該只有很小的變化(例如,更新總時間編輯,最後編輯等等)。比較他們,看看發生了什麼。 – 2014-09-19 17:08:52

回答

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

我最近遇到了類似的問題,並將其發佈在這裏,http://stackoverflow.com/questions/26006514/microsof-office-2010-will-not- open-two-xls 我在嘗試打開兩個xls文件時遇到了Office 2010的問題。 – Vink 2014-09-24 00:06:03

相關問題