Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从2个excel文件中读取数据并允许用户从这两个文件中搜索相关字段的程序_C#_Excel - Fatal编程技术网

C# 从2个excel文件中读取数据并允许用户从这两个文件中搜索相关字段的程序

C# 从2个excel文件中读取数据并允许用户从这两个文件中搜索相关字段的程序,c#,excel,C#,Excel,这应该是一个程序,它读取2个excel文件,将数据存储在两个数组中,使用户能够通过文本框搜索特定的zip/位置,并在搜索框中输入时通过标签提示与之相关的位置,反之亦然 我的问题是,红色文件需要花费太多时间。我愿意听取关于如何缩短阅读时间的建议 using System; using System.Collections.Generic; using System.Collections.Generic; using System.Data; using System.Drawing; using

这应该是一个程序,它读取2个excel文件,将数据存储在两个数组中,使用户能够通过文本框搜索特定的zip/位置,并在搜索框中输入时通过标签提示与之相关的位置,反之亦然

我的问题是,红色文件需要花费太多时间。我愿意听取关于如何缩短阅读时间的建议

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

}使用您的代码读取包含3000行数据的每个Excel文件大约需要20秒。我没有遍历Excel文件并查找空单元格,而是创建了一个方法(ReadSheet),该方法将获取Excel工作表并返回3000行第一列数据的字符串数组。我使用一个object
Array
获取所有单元格值,然后将其转换为字符串数组。阅读速度快得多。不幸的是,我无法利用
工作表。使用drange
函数获取所有行,不管有多少行,因为它一直给我错误的编号。我得调查一下。希望这有帮助

编辑:更改为使用范围获取所有单元格。我遇到的问题是我使用的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();
  }
}
公共部分类表单1:表单
{
字符串[]拉链;
字符串[]位置;
公共表格1()
{
初始化组件();
}
私有void Form1\u加载(对象发送方、事件参数e)
{
Excel.Application objExcel=新的Excel.Application();
Excel.Workbook objWorkbook=objExcel.Workbooks.Open(@“C:\Users\John\Desktop\cs\TestExcel2_3000.xlsx”);
Excel.Worksheet objWorksheet=objWorkbook.Worksheets[“Tabelle1”];
zip=阅读表(OBJWORKEY);
objWorkbook.Close();
Excel.Workbook objWorkbook1=objExcel.Workbooks.Open(@“C:\Users\John\Desktop\cs\TestExcel3_3000.xlsx”);
Excel.Worksheet objWorksheet1=objWorkbook1.Worksheets[“Tabelle1”];
地点=阅读表(objWorksheet1);
objWorkbook1.Close();
objExcel.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(objWorkbook);
System.Runtime.InteropServices.Marshal.ReleaseComObject(objWorkbook1);
System.Runtime.InteropServices.Marshal.ReleaseComObject(objExcel);
}
私有字符串[]读表(Excel.Workplace inSheet)
{
Excel.Range targetCells=inSheet.UsedRange;
//Excel.Range targetCells=inSheet.Range[“A1:A3000”];
数组allValues=(数组)targetCells.Cells.Value;
返回allValues.Cast().ToArray();
}
}

使用您的代码读取包含3000行数据的每个Excel文件大约需要20秒。我没有遍历Excel文件并查找空单元格,而是创建了一个方法(ReadSheet),该方法将获取Excel工作表并返回3000行第一列数据的字符串数组。我使用一个object
Array
获取所有单元格值,然后将其转换为字符串数组。阅读速度快得多。不幸的是,我无法利用
工作表。使用drange
函数获取所有行,不管有多少行,因为它一直给我错误的编号。我得调查一下。希望这有帮助

编辑:更改为使用范围获取所有单元格。我遇到的问题是我使用的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();
  }
}
公共部分类表单1:表单
{
字符串[]拉链;
字符串[]位置;
公共表格1()
{
初始化组件();
}
私有void Form1\u加载(对象发送方、事件参数e)
{
Excel.Application objExcel=新的Excel.Application();
Excel.Workbook objWorkbook=objExcel.Workbooks.Open(@“C:\Users\John\Desktop\cs\TestExcel2_3000.xlsx”);
Excel.Worksheet objWorksheet=objWorkbook.Worksheets[“Tabelle1”];
zip=阅读表(OBJWORKEY);
objWorkbook.Close();
Excel.Workbook objWorkbook1=objExcel.Workbooks.Open(@“C:\Users\John\Desktop\cs\TestExcel3_3000.xlsx”);
Excel.Worksheet objWorksheet1=objWorkbook1.Worksheets[“Tabelle1”];
地点=阅读表(objWorksheet1);
objWorkbook1.Close();
objExcel.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(objWorkbook);
System.Runtime.InteropServices.Marshal.ReleaseComObject(objWorkbook1);
System.Runtime.InteropServices.Marshal.ReleaseComObject(objExcel);
}
私有字符串[]读表(Excel.Workplace inSheet)
{
Excel.Range targetCells=inSheet.UsedRange;
//Excel.Range targetCells=inSheet.Range[“A1:A3000”];
数组allValues=(数组)targetCells.Cells.Value;
返回allValues.Cast().ToArray();
}
}

同样的问题-它无法获得非空单元格的数量。我在Excel表中明确定义了行数(与我上面的代码不同-单元格为2652),然后通过迭代单元格数组将这些值分配给范围为cells-1的adequat预定义字符串数组,因为第0个元素(因此[I-1]和[j-1]从数组中的第0个元素开始)。我的逻辑是,使用这种方法不会有任何空值,但我不断得到异常,系统向我提供消息,说明不可能有任何“空”值。我不确定我是否理解你的评论。我以为你的问题是:我的问题是文件需要太多时间才能变红。如果你的范围内有空单元格,而你想不想忽略它们,我不清楚你想实现什么。我只是想在你编写代码前的最后一行快速读取文件。您想读入数组中的内容是什么?按原样编写代码,一旦到达空单元格,它就会停止读取文件。所以我很好奇你的数组怎么会以空值结束。你从哪里得到这些异常?当我将两个数组的元素数设置为等于excel文件中的实际行数时,就发生了这种情况。但错误在我这边——我将数组设置为比行数小1个元素。这个算法似乎运行得很好——这个