在C#中使用OLEDB读取密码保护的excel文件

在我的C#应用​​程序中,我使用OLEDB连接string“ Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\test.xls;Extended Properties=\"Excel 8.0;HDR=NO;ReadOnly=true;IMEX=1\" ”来读取Excel文件。 为了读取受密码保护的文件,我尝试在连接string中添encryption码字段,但无法读取文件。 我想知道是否有任何方法来读取使用OLEDB密码保护的Excel文件,如果我事先知道它的密码。

以下是连接到Excel文件 (包括OLEDB)的不同方法 。 据此,您不能用标准方法打开密码保护的文件。 您必须使用解决方法。

如果Excel工作簿受密码保护,则即使通过连接string提供正确的密码,也无法打开该工作簿进行数据访问。 如果您尝试,您收到以下错误信息:“无法解密文件。

这是解决scheme ,虽然不是在C#中,但你可以很容易地适应你的目的。

如果你自己不知道密码,另一种方法是不用密码重新写入文件。 您可以使用这个方便的项目,并添加以下例程:

 public void SaveFile() { this.excelWorkbook.SaveAs( this.excelWorkbook.FullName, vk_format, "", vk_write_res_password, vk_read_only, null, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, null, vk_add_to_mru, null,null,vk_local); } 

详细在这里 。

如果您使用查询来读取excel文件,那么是否有一些表是受保护的:无论哪种方式。

  private string ExcelConnection(string fileName) { return @"Provider=Microsoft.Jet.OLEDB.4.0;" + @"Data Source=" + fileName + ";" + @"Extended Properties=" + Convert.ToChar(34).ToString() + @"Excel 8.0" + Convert.ToChar(34).ToString() + ";"; } private DataTable readExcel(string fileName, string sql) { OleDbConnection conn = new OleDbConnection(ExcelConnection(fileName)); OleDbCommand cmd = new OleDbCommand(sql, conn); OleDbDataAdapter adp = new OleDbDataAdapter(); adp.SelectCommand = cmd; DataTable dt = new DataTable(); try { adp.FillSchema(dt, SchemaType.Source); adp.Fill(dt); } catch { } return dt; } 

您可以使用OoXmlCryptostream访问Office 2007encryption文件。 开源,包括修改后的ExcelPackage。

示例代码:

 using (OfficeCryptoStream stream = OfficeCryptoStream.Open("a.xlsx", "password")) { // Do stuff (eg create System.IO.Packaging.Package or // ExcelPackage from the stream, make changes and save) // Change the password (optional) stream.Password = "newPassword"; // Encrypt and save the file stream.Save(); } 

经过一遍又一遍的研究,终于find了两件事。
1.使用OLEDB,不能读取密码保护的excel文件。
2.即使Interop可以读取excel文件,不论密码保护与否,其性能都不如OLEDB。

所以,我通过结合创build下面的代码
OLEDB具有非常好的性能
2.可以读取每个excel文件的interop。

 public DataTable ReadPasswordProtectedExcel(string ExcelFilePath, string Password) { String TempExcelFilePath = string.Empty; DataTable _DataTable = new DataTable(); #region Get ExcelFile and Remove Password { String TempExcelFileName = string.Empty; String DirectoryPath = string.Empty; Microsoft.Office.Interop.Excel.Application excelapp = new Microsoft.Office.Interop.Excel.Application(); excelapp.Visible = false; Microsoft.Office.Interop.Excel.Workbook newWorkbook = excelapp.Workbooks.Open(ExcelFilePath, 0, true, 5, Password, "", false, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "", true, false, 0, true, false, false); TempExcelFileName = string.Format("{0}_{1}", "__", Path.GetFileName(ExcelFilePath)); // __xxx.xlsx TempExcelFilePath = String.Format("{0}/{1}", Path.GetDirectoryName(ExcelFilePath), TempExcelFileName); /// Create new excel file and remove password. newWorkbook.SaveAs(TempExcelFilePath, Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookDefault, "", "", false, false, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing); newWorkbook.Close(true, "", false); excelapp.Quit(); Marshal.ReleaseComObject(excelapp); } #endregion #region Get data from excel file by using OLEDB { _DataTable = ReadExcelFileInOLEDB(TempExcelFilePath); ///Delete excel file File.Delete(TempExcelFilePath); } #endregion return _DataTable; } public DataTable ReadExcelFileInOLEDB(string _ExcelFilePath) { string ConnectionString = string.Empty; string SheetName = string.Empty; DataTable _DataTable = null; DataSet _DataSet = null; try { ConnectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 12.0;HDR=YES;IMEX=0;'", _ExcelFilePath); using (OleDbConnection _OleDbConnection = new OleDbConnection(ConnectionString)) { _OleDbConnection.Open(); _DataTable = _OleDbConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); if (_DataTable == null) return null; SheetName = _DataTable.Rows[0]["TABLE_NAME"].ToString(); ConnectionString = string.Format("SELECT * FROM [{0}]", SheetName); using (OleDbCommand _OleDbCommand = new OleDbCommand(ConnectionString, _OleDbConnection)) { using (OleDbDataAdapter _OleDbDataAdapter = new OleDbDataAdapter()) { _OleDbDataAdapter.SelectCommand = _OleDbCommand; _DataSet = new DataSet(); _OleDbDataAdapter.Fill(_DataSet, "PrintInfo"); return _DataSet.Tables["PrintInfo"]; } } } } catch (Exception ex) { throw ex; } } 

最后如果你想从excel中检索数据的时候删除空行,请检查这个链接和下面的代码

 SELECT * FROM NAMED_RANGE WHERE [YourColumnTitle] IS NOT NULL