1

C#Excelデータの読み取りに使用するのは初めてです。Microsoft.ACE.OLEDB.12.0 を使用して Excel シート データを読み取っています。しかし、私の問題は、シートがB4(通常ではなくA1)セルから始まるため、データの読み取り中に問題に直面していることです。以下は私の方法です:

   public static DataSet GetExcelFileData(String fileNameWPath, String sheetName, String rangeName, String fieldList, String whereClause)
    {
        DataSet xlsDS = new DataSet();
        String xlsFields = String.Empty;
        String xlsWhereClause = String.Empty;
        String xlsSqlString = String.Empty;
        String xlsTempPath = @"C:\temp\";
        //Copy File to temp folder locations....
        String xlsTempName = Path.GetFileNameWithoutExtension(fileNameWPath);
        xlsTempName = xlsTempName.Replace(".", String.Empty).Replace(" ", "_").Replace("-", "_").Replace("&", String.Empty).Replace("~", String.Empty) + ".xls";
        //Check if sqlFields and Where Clause is Empty....
        if (String.IsNullOrEmpty(fieldList))
            xlsFields = "*";
        else
            xlsFields = fieldList;

        if (!String.IsNullOrEmpty(whereClause))
            xlsWhereClause = whereClause;


        //String oleDBConnString = String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source ={0};Extended Properties=\"Excel 8.0; IMEX=1\"", xlsTempPath + Path.GetFileName(xlsTempName));
        String oleDBConnString = String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0;HDR=NO;IMEX=0\"", xlsTempPath + Path.GetFileName(xlsTempName));

        OleDbConnection xlsConnect = null;
        try
        {
            File.Copy(fileNameWPath, xlsTempPath + Path.GetFileName(xlsTempName), true);
            xlsConnect = new OleDbConnection(oleDBConnString);
            OpenConnection(xlsConnect);

            //Get Worksheet information 
            DataTable dbSchema = xlsConnect.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
            if (dbSchema == null || dbSchema.Rows.Count < 1)
            {
                throw new Exception(String.Format("Failed to get worksheet information for {0}", fileNameWPath));
            }

            DataRow[] sheets = dbSchema.Select(String.Format("TABLE_NAME LIKE '*{0}*'", sheetName.Replace("*", String.Empty)));

            if (sheets.Length < 1)
            {
                throw new Exception(String.Format("Could not find worksheet {0} in {1}", sheetName, fileNameWPath));
            }
            else
            {
                string realSheetName = sheets[0]["TABLE_NAME"].ToString();

                //Build Sql String
                xlsSqlString = String.Format("Select {0} FROM [{1}${2}] {3}", xlsFields, sheetName, rangeName, xlsWhereClause);
                //xlsSqlString = String.Format("Select {0} FROM [{1}${2}] {3}", xlsFields, sheetName, "", xlsWhereClause);
                OleDbCommand cmd = new OleDbCommand(xlsSqlString, xlsConnect);
                OleDbDataAdapter adapter = new OleDbDataAdapter(xlsSqlString, xlsConnect);
                adapter.SelectCommand = cmd;
                adapter.Fill(xlsDS);
                return xlsDS;

            }


        }
        catch (FormatException ex)
        {
            throw ex;
        }
        catch (Exception ex2)
        {
            if (ex2.Message.ToLower().Equals("no value given for one or more required parameters."))
            {
                throw new Exception(String.Format("Error in Reading File: {0}. \n Please Check if file contains fields you request Field List: {1}", fileNameWPath, xlsFields));
            }
            throw new Exception(String.Format("Error in Reading File: {0}\n Error Message: {1}", fileNameWPath, ex2.Message + ex2.StackTrace));
        }
        finally
        {
            CloseConnection(xlsConnect);
            File.Delete(xlsTempPath + Path.GetFileName(xlsTempName));
        }
    }

また、Jet Engine の古いバージョンである Microsoft.Jet.OLEDB.4.0 を使用してみましたが、正常に動作します。ただし、64 ビット サーバーに移行したため、最新の OleDb 12.0 エンジンを使用する必要があります。範囲 ("B4:IV65536") を指定してデータを読み取ろうとするたびに、次の例外が発生します。

「Microsoft Office Access データベース エンジンは、オブジェクト 'Report1$B4:IV65536' を見つけることができませんでした。オブジェクトが存在すること、およびその名前とパス名のつづりが正しいことを確認してください。」

また、HDR、IMEX の多くの順列の組み合わせを試したことに注意してください (それらをそれぞれ Yes/No & 0/1 に設定しますが、それは役に立ちませんでした)。

回避策を提案してください。

ありがとう、アビナフ

4

0 に答える 0