2016-11-20 2 views
1

Предполагается, что это программа, которая считывает из 2 файлов excel, сохраняет данные в двух массивах и позволяет пользователям выполнять поиск через текстовое поле для определенного zip/place и на вкладке в поле поиска, чтобы получить подсказку с местом/с, которые связаны с ним через lable или наоборот.Программа, которая считывает из 2 файлов excel и позволяет пользователям искать соответствующие поля из обоих файлов.

Моя проблема заключается в том, что для красных файлов требуется слишком много времени. Я открыт для предложений о том, как сократить время чтения.

using System; 
using System.Collections.Generic; 
using System.Collections.Generic; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using Excel = Microsoft.Office.Interop.Excel ; 

namespace ExcelDateilesen_1 
{ 
public partial class Form1 : Form 
{ 
    string[] zip = new string[3000]; 
    string[] place = new string[3000]; 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     Excel.Application objExcel = new Excel.Application(); 
     Excel.Workbook objWorkbook = objExcel.Workbooks.Open 
      (@"C:\Users\ggr\Documents\plz.xlsx"); 
     Excel.Worksheet objWorksheet = objWorkbook.Worksheets["Tabelle1"]; 

     Excel.Range objCell; 
     int i = 1; 
     do 
     { 
      objCell = objWorksheet.Cells[i, 1]; 

      if (objCell.Value == null) break; 

      if (objCell.Value is string) 
      { 
       zip[i - 1] = objCell.Value; 
      } 
      i++; 
     } while (true); 
     objWorkbook.Close(); 
     objExcel.Quit(); 

     Excel.Application objExcel1 = new Excel.Application(); 
     Excel.Workbook objWorkbook1 = objExcel1.Workbooks.Open 
      (@"C:\Users\ggr\Documents\ort.xlsx"); 
     Excel.Worksheet objWorksheet1 = objWorkbook1.Worksheets["Tabelle1"]; 

     Excel.Range objCell1; 

     int j = 1; 
     do 
     { 
      objCell1 = objWorksheet1.Cells[j, 1]; 

      if (objCell1.Value == null) break; 

      if (objCell1.Value is string) 
      { 
       place[j - 1] = objCell1.Value; 
      } 
      j++; 
     } while (true); 
     objWorkbook1.Close(); 
     objExcel1.Quit(); 
    } 
} 

}

ответ

0

Это заняло около 20 секунд, чтобы прочитать каждый файл Excel, содержащий 3000 строк данных с использованием кода. Вместо того, чтобы перебирать файл Excel и искать нулевую ячейку, я создал метод (ReadSheet), который будет обрабатывать листы Excel и возвращать строковый массив первого столбца данных для 3000 строк. Я использовал объект Array, чтобы получить все значения ячеек, а затем передать его в массив строк. Чтение было намного быстрее. К сожалению, я не смог воспользоваться функцией worksheet.UsedRange, чтобы получить все строки независимо от того, сколько их было, потому что это продолжало давать мне неправильный номер. Мне нужно будет изучить это. Надеюсь это поможет.

EDIT: Изменено на UsedRange, чтобы получить все ячейки. Проблема у меня была с листом excel, который я использовал.

public partial class Form1 : Form 
{ 
    string[] zip; 
    string[] place; 
    public Form1() 
    { 
    InitializeComponent(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
    Excel.Application objExcel = new Excel.Application(); 
    Excel.Workbook objWorkbook = objExcel.Workbooks.Open(@"C:\Users\John\Desktop\cs\TestExcel2_3000.xlsx"); 
    Excel.Worksheet objWorksheet = objWorkbook.Worksheets["Tabelle1"]; 

    zip = ReadSheet(objWorksheet); 
    objWorkbook.Close(); 
    Excel.Workbook objWorkbook1 = objExcel.Workbooks.Open(@"C:\Users\John\Desktop\cs\TestExcel3_3000.xlsx"); 
    Excel.Worksheet objWorksheet1 = objWorkbook1.Worksheets["Tabelle1"]; 

    place = ReadSheet(objWorksheet1); 
    objWorkbook1.Close(); 
    objExcel.Quit(); 
    System.Runtime.InteropServices.Marshal.ReleaseComObject(objWorkbook); 
    System.Runtime.InteropServices.Marshal.ReleaseComObject(objWorkbook1); 
    System.Runtime.InteropServices.Marshal.ReleaseComObject(objExcel); 
    } 

    private string[] ReadSheet(Excel.Worksheet inSheet) 
    { 
    Excel.Range targetCells = inSheet.UsedRange; 
    //Excel.Range targetCells = inSheet.Range["A1:A3000"]; 
    Array allValues = (Array)targetCells.Cells.Value; 
    return allValues.Cast<string>().ToArray(); 
    } 
} 
+0

Same Problem - он не получит количество непустых ячеек. Я явно определял количество строк, как в листе Excel (не как в моем коде выше - ячейки 2652), а затем путем итерации через ячейки. Массив присваивал эти значения адекватной предопределенной строке Array с ячейками диапазона номера - 1 из-за 0-го элемента (поэтому [i-1] и [j-1] начинаются с 0-го элемента массива). Моя логика заключалась в том, что с использованием этого подхода не будет никаких нулевых значений, но я продолжал получать исключения, и система просила меня сообщениями, что не может быть никаких «нулевых» значений. –

+0

Я не уверен, что я понимаю ваш комментарий. Я думал, что ваша проблема: _My проблема в том, что для файлов требуется слишком много времени. Если в вашем диапазоне есть пустые ячейки, и вы хотите их игнорировать или нет, я не понимаю, чего вы хотите достичь. Я просто пытался обратиться к более быстрому чтению файлов в качестве последней строки до того, как вы укажете состояния кода. Что вы хотите прочитать в массивах? – JohnG

+0

Вы код как есть, он перестанет читать файл, как только он достигнет нулевой ячейки. Поэтому мне любопытно, как ваш массив может получить нулевое значение. – JohnG

Смежные вопросы