[ad_1]
oledb を使用して Excel を読んでいたとき、データを正常に取得しています。 ただし、シート名に ‘#’ が含まれていると、データを読み取れません。
次のエラーが発生します。
” は有効な名前ではありません。無効な文字や句読点が含まれていないこと、および長すぎないことを確認してください。
[EDIT – OP code from comment]
Microsoft.Office.Interop.Excel.Application excelFileObject = new Microsoft.Office.Interop.Excel.Application(); Microsoft.Office.Interop.Excel.Workbook workBookObject = null; workBookObject = excelFileObject.Workbooks.Open(File, 0, true, 5, "", "", false, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "", true, false, 0, true, false, false); Microsoft.Office.Interop.Excel.Sheets sheets = workBookObject.Worksheets; Microsoft.Office.Interop.Excel.Worksheet sheet = null; String Con = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + File + ";Extended Properties="Excel 12.0;HDR=Yes;IMEX=2\""; OleDbConnection obj_Con = new OleDbConnection(Con); obj_Con.Open(); string sheet_Name = "ABCD#EFGH"; string query = String.Format("select * from [{0}$]", sheet_Name); OleDbCommand obj_CmdSelect = new OleDbCommand(query, obj_Con); OleDbDataAdapter obj_Adapter = new OleDbDataAdapter(); obj_Adapter.SelectCommand = obj_CmdSelect; DataSet obj_Dataset = new DataSet(); obj_Adapter.Fill(obj_Dataset, "Data"); /// Error occurs here
解決策 2
interop と oleDb の両方を使用している理由がわかりません。
相互運用機能を介して既にワークブックを開いているので、それを使用してシートにアクセスし続けます – その後、インデックスを介してそれらを参照するオプションがあります [1]、 [2] など(つまり、名前を無視します-絶対に必要な場合は、シート名の別のリストを用意してください)、または使用できます foreach
例: (未テスト)
C#
Microsoft.Office.Interop.Excel.Application excelFileObject = new Microsoft.Office.Interop.Excel.Application(); Microsoft.Office.Interop.Excel.Workbook workBookObject = null; workBookObject = excelFileObject.Workbooks.Open(File, 0, true, 5, "", "", false, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "", true, false, 0, true, false, false); Microsoft.Office.Interop.Excel.Sheets sheets = workBookObject.Worksheets; DataSet oDS = new DataSet(); foreach (Microsoft.Office.Interop.Excel.Worksheet sheet in sheets) { DataTable obj_Dataset = FillDataSetFromWorkSheet(sheet); oDS.Tables.Add(obj_Dataset); }
と
C#
private DataTable FillDataSetFromWorkSheet(Microsoft.Office.Interop.Excel.Worksheet sheet) { var oDT = new DataTable(); for (int colIndex = 0; colIndex < MaxCols; colIndex++) oDT.Columns.Add(string.Format("Column{0}", colIndex)); for (int rowIndex = 1; rowIndex <= MaxRows; rowIndex++) { var row = oDT.NewRow(); //Note Excel arrays are 1-based not 0-based for (int colIndex = 0; colIndex < MaxCols; colIndex++) row[colIndex] = Convert.ToString(((Microsoft.Office.Interop.Excel.Range)sheet.Cells[rowIndex, colIndex + 1]).Value2); oDT.Rows.Add(row); } return oDT; }
私はちょうど持っていた MaxCols
と MaxRows
定数としてですが、必要に応じて派生させることができます。
解決策 1
最初に、名前に # や & などの特殊文字が含まれていないことを確認してください。特定の文字が含まれていると競合します。文字のリストについてはわかりません。
シートでデータを取得するなど、最初のステップでファイルの名前または拡張子を確認するときに、可能であれば制限を与えてください。
C#
private static Excel.Workbook MyBook = null; private static Excel.Application MyApp = null; private static Excel.Worksheet MySheet = null;
C#
MyApp = new Excel.Application();
MyBook = MyApp.Workbooks.Open(DB_PATH);
MySheet = (Excel.Worksheet)MyBook.Sheets[1];
[ad_2]
コメント