2

私はC#プロジェクトに取り組んでいます

以下のコードを使用して、DataSet に XLS または XLSX ファイルをインポートします。

public static DataSet ImportExcelXLS(string FileName, bool hasHeaders)
{
    string HDR = hasHeaders ? "Yes" : "No";
    string strConn;
    if (FileName.Substring(FileName.LastIndexOf('.')).ToLower() == ".xlsx")
    {
            strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + FileName + ";Extended Properties=\"Excel 12.0;HDR=" + HDR + ";IMEX=0\"";
    }
    else
    {
            strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + FileName + ";Extended Properties=\"Excel 8.0;HDR=" + HDR + ";IMEX=0\"";
    }

    DataSet output = new DataSet();

    using (OleDbConnection conn = new OleDbConnection(strConn))
    {
        conn.Open();

        DataTable schemaTable = conn.GetOleDbSchemaTable(
            OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });

        foreach (DataRow schemaRow in schemaTable.Rows)
        {
            string sheet = schemaRow["TABLE_NAME"].ToString();

            if (!sheet.EndsWith("_"))
            {
                try
                {
                    OleDbCommand cmd = new OleDbCommand("SELECT * FROM [" + sheet + "]", conn);
                    cmd.CommandType = CommandType.Text;

                    sheet = sheet.Replace("$", "");
                    DataTable outputTable = new DataTable(sheet);
                    output.Tables.Add(outputTable);
                    new OleDbDataAdapter(cmd).Fill(outputTable);
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message + string.Format("Sheet:{0}.File:F{1}", sheet, FileName), ex);
                }
            }
        }
    }
    return output;
}

このコードは、パスワードなしで Excel ファイルをロードする場合に正しく機能します。ただし、パスワード付きのファイルをロードするために実行すると、次のエラーが表示されます。

アプリケーションを開始できません。ワークグループ情報ファイルが見つからないか、別のユーザーによって排他的に開かれています。

暗号化ファイルをロードするためにコードを変更するにはどうすればよいですか?

4

2 に答える 2

1

してください:このライブラリを使用してください:

using Microsoft.Office.Interop.Excel

パスワードを入力してください:

WorkbookObject.Password = password;

ConnString を変更してください:

string conn = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + s + ";Password=password;Extended Properties='Excel 8.0;HDR=YES'";

ここで、あなたの答えは次のとおりです。

 if (FileName.Substring(FileName.LastIndexOf('.')).ToLower() == ".xlsx")
 {
     strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + FileName + ";Password=password;Extended Properties=\"Excel 12.0;HDR=" + HDR + ";IMEX=0\"";
 }
 else
 {
     strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + FileName + ";Password=password;Extended Properties=\"Excel 8.0;HDR=" + HDR + ";IMEX=0\"";
 }
于 2012-11-30T12:25:27.477 に答える
0

このコードを試してください:

strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + FileName + ";Password=password;Extended Properties=\"Excel 8.0;HDR=" + HDR + ";IMEX=0\"";

それでも例外が発生しました:

アプリケーションを開始できません。ワークグループ情報ファイルが見つからないか、別のユーザーによって排他的に開かれています。

于 2016-12-15T07:21:03.887 に答える