处理 Excel 文件中的额外列 - C#

本文关键字:Excel 文件 处理 | 更新日期: 2023-09-27 18:32:59

在我的应用程序中,我需要读取一个 excel 文件并以表格格式显示标题(标题)。到目前为止,这工作正常。但是对于某些 excel 文件,它会显示(excel 文件有 20 列)一些额外的列(列 21、列 22 等)。不知道为什么它显示这些额外的列当我检查 excel 文件时,它只有 20 列,21 或 22 列完全为空。不知道为什么我显示这些额外的列。当我尝试调试代码"myReader.FieldCount"时,显示22列。我试图以编程方式删除那些空的列。但它引发了行数据的其他一些问题。对于某些行,它仅显示 18 或 15 列,因为那里某些列缺少数据。有没有更好的方法来处理 excel。这是我的代码

@@@@

@@

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

处理 Excel 文件中的额外列 - C#

而不是 SELECT * 列出要在其中选择的列:

cmd = new OleDbCommand("SELECT col1, col2, col3 FROM [" + worksheetName + "]", conn);

最好的解决方案是通过正则表达式判断和过滤列名一旦列为空,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