2013-09-27 2 views
1

В моем приложении мне нужно прочитать файл excel и отобразить заголовки (заголовок) в табличном формате. Это прекрасно работает. Но для некоторых файлов excel он показывает (файл excel имеет 20 столбцов) некоторые дополнительные столбцы (column21, column22 и т. Д.). Не уверен, почему он показывает эти дополнительные столбцы , когда я проверил файл excel, он имеет только 20 столбцов и 21 или 22 столбца полностью пуст. Не уверен, почему мой экран отображает эти дополнительные столбцы. Когда я попытался отладить код, «myReader.FieldCount» показывал 22 столбца. Я попытался программно удалить те столбцы, которые пусты. Но он поднял некоторые проблемы с данными строк. Для некоторых строк в нем отображаются только 18 или 15 столбцов, так как там отсутствует данные для некоторых столбцов. Есть ли лучший способ справиться с преимуществом. Вот мой кодРабота с дополнительными столбцами в файлах Excel - C#

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

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

Несколько наблюдений. Если вы хотите получить заголовки столбцов, нет необходимости перебирать все строки на листе с помощью DataReader; Просто проверьте первый ряд, предполагая, что это место, где они расположены. Вы упоминаете, что игнорируете пустые поля подряд, но вы, кажется, озадачены тем, почему вы видите только количество X в качестве вывода ... что это такое? Помните, что пробелы также считаются символами, поэтому, если ячейка кажется пустой, это может и не быть. Используйте string.Trim() или String.IsNullOrWhiteSpace (.NET 4.0>), чтобы убедиться, что вы не включаете «пустые» пробелы. –

ответ

0

Вместо SELECT * список из столбцов, которые вы хотите выбрать в:

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

У меня нет контроля над количеством столбцов, они меняются динамически. Все зависит от того, какой файл загружается пользователем. – Henry

+0

Если у вас нет контроля над количеством столбцов, как вы скажете, из каких столбцов вы хотите избавиться? – Vulcronos

+0

Я хочу все столбцы на листе excel. Но он добавляет некоторые дополнительные столбцы, которые пусты. Не знаю, почему добавляются дополнительные столбцы. – Henry

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 
Смежные вопросы