1

私のアプリケーションでは、Excel ファイルを読み取り、ヘッダー (タイトル) を表形式で表示する必要があります。これはこれまでのところうまくいきます。ただし、一部の Excel ファイルでは、いくつかの追加の列 (column21、column22 など) が表示されます (Excel ファイルには 20 列あります)。Excelファイルをチェックしたときにこれらの余分な列が表示される理由がわかりません.20列しかなく、21列または22列が完全に空です。これらの余分な列を表示する理由がわかりません。コード「myReader.FieldCount」をデバッグしようとすると、22 列が表示されました。空の列をプログラムで削除しようとしました。しかし、行データで別の問題が発生しました。一部の行では、一部の列のデータが欠落しているため、18 または 15 列しか表示されません。エクセルで何か良い方法はありませんか?これが私のコードです

@@@@@@@@@@@@@

  if (sourceFile.ToUpper().IndexOf(".XLSX") >= 0)     // excel 2007 or later file    
                strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + sourceFile + ";Extended Properties=\"Excel 12.0;HDR=No;\"";
            else         // previous excel versions
                strConn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + sourceFile + ";Extended Properties=\"Excel 8.0;HDR=No;\"";

            OleDbConnection conn = null;
            StreamWriter wrtr = null;
            OleDbCommand cmd = null;
            OleDbDataReader myReader = null;

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

                cmd = new OleDbCommand("SELECT * FROM [" + worksheetName + "]", conn);
                cmd.CommandType = CommandType.Text;
                myReader = cmd.ExecuteReader();
                wrtr = new StreamWriter(targetFile);

                while (myReader.Read())
                {
                    List<string> builder = new List<string>();
                    for (int y = 0; y < myReader.FieldCount; y++)
                    {                        
                        if(!string.IsNullOrEmpty(myReader[y].ToString()))
                            builder.Add("\"" + myReader[y].ToString() + "\"");

                    }
                    wrtr.WriteLine(string.Join(",", builder));
                }
4

2 に答える 2

0

最善の解決策は、正規表現で列名を判断してフィルター処理することです。列が空になると、C# は「F21」「F22」のような列名を自動生成します (21 は空の列が 21 列であることを示します)

DataTable x = ...  // x is DataTable Name
int index = ...    // index is the column sequence no.
string col = x.Columns[index].Columnname.ToString().Trim();    
if (!System.Text.RegularExpressions.Regex.IsMatch(col, "^[A-Z]{1}[0-9]*"))
   // do something
于 2014-02-24T10:30:05.297 に答える
0

SELECT * の代わりに、選択したい列をリストします。

cmd = new OleDbCommand("SELECT col1, col2, col3 FROM [" + worksheetName + "]", conn);
于 2013-09-27T14:25:32.747 に答える