2009-08-31 32 views
11

私のC#アプリケーションでは、OLEDB接続文字列「Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\test.xls;Extended Properties=\"Excel 8.0;HDR=NO;ReadOnly=true;IMEX=1\"」を使用してExcelファイルを読み取ります。 パスワードで保護されたファイルを読み取るために、接続文字列にパスワードフィールドを追加しようとしましたが、ファイルを読み取れませんでした。 パスワードを事前に知っていれば、パスワードで保護されたExcelファイルを読み取る方法はありますか?C#でOLEDBを使用してパスワード保護されたExcelファイルを読み取る

+2

PWD =パスワード以下くださいあなたは試してみましたか? – Havenard

答えて

5

ここにはOLEDBを含むdifferent ways to connect to an Excel fileがあります。これによると、標準的な方法でパスワードで保護されたファイルを開くことはできません。回避策を使用する必要があります。

Excelワークブックが パスワードで保護されている場合、あなたもあなたの接続文字列を使用して 正しいパスワードを供給することにより、 データアクセスのためにそれを開くことができません。 C#ではないとはいえ、 復号化ファイルではありませんでした」

This is the solutionをしていますが、簡単に自分の目的のためにそれを適応させることができ

あなたはドン場合」:。あなたがしようとすると、 次のエラーメッセージが表示されます。トンパスワードを自分で知っているが、代替は、パスワードなしでファイルを再作成することですあなたはthis handy projectを使用して、それに次のルーチンを追加することができます。。

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); 
     } 

Full detail here

2

OoXmlCrypto streamを使用すると、Office 2007で暗号化されたファイルにアクセスできます。オープンソース、変更されたExcelPackageを含む

サンプルコード:

using (OfficeCryptoStream stream = OfficeCryptoStream.Open("a.xlsx", "password")) 
{ 
    // Do stuff (e.g. 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(); 
} 
5

は、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; 
    } 
1

私は何度も何度も調査した後、最終的に私は2つのことを発見しました。
1. OLEDBを使用すると、パスワードで保護されたExcelファイルを読み取ることができません。
2. Interopはパスワード保護されているかどうかに関わらずExcelファイルを読み取ることはできますが、その性能はOLEDBほど良くありません。

だから、私は非常に素晴らしいパフォーマンスと、すべてのファイルを読むことができる優れ
2.相互運用機能を持ってい
1. OLEDBを組み合わせることにより、コードの下に作成します。

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からデータを取得中に空の行を削除したい場合は最後に、this linkをチェックして、コード

SELECT * FROM NAMED_RANGE WHERE [YourColumnTitle] IS NOT NULL 
関連する問題