0
string workbookPath = filePath;
Excel.Application xlApp;
Excel.Workbook xlWorkBook;
Excel.Worksheet xlWorkSheet;
Excel.Range range;

int rCnt = 0;
int cCnt = 0;

xlApp = new Excel.Application();
xlWorkBook = xlApp.Workbooks.Open(workbookPath, 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);
xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);

range = xlWorkSheet.UsedRange;

int rowCount = range.Rows.Count;
int columnCount = range.Columns.Count;

string[][] myArray = new string[rowCount][];

for (rCnt = 1; rCnt < rowCount; rCnt++)
{
    myArray[rCnt] = new string[columnCount];

    for (cCnt = 1; cCnt < columnCount; cCnt++)
    {

        object str = (range.Cells[rCnt, cCnt] as Excel.Range).get_Value();
----->  myArray[rCnt][cCnt] = str == null ? string.Empty : str.ToString();


    }
}


xlWorkBook.Close(true, null, null);
xlApp.Quit();

return myArray;

以上是将excel文件上传到sql数据库的代码。本质上,当我传递 ----> 上面的 rCnt 和 cCnt 变量时……行数每次增加一次,列数增加两次……我希望列数增加到 3,或者有很多可用的列。

这样做的原因可能是在 excel csv 的第一行 - 单元格中没有任何内容 - 但是,在第 4-5 行中,第 3 列中有数据。

谁能看看我错过了什么?

任何问题/帮助将不胜感激。

4

1 回答 1

0

我的第一个猜测是您的代码允许您返回一个锯齿状数组,string[][] myArray = new string[rowCount][];并且myArray[rCnt] = new string[columnCount];您以某种方式超出了这些界限。UsedRange 有时可能很挑剔(特别是如果您删除了数据 - 范围不会缩小以适合您当前的数据)。

这段代码对我来说很好,我在工作中使用它。不包括 COM 入口/发布代码,如果需要,我可以稍后添加。

public string[,] ReadArray(int SheetNumber)
{
  worksheet = (Excel.Worksheet)sheets.get_Item(SheetNumber);
  Excel.Range range = worksheet.UsedRange;

  //Get array, use range values. Not always correct, esp if user has deleted data. Ignore null values
  Object[,] arr = range.Cells.Value;
  string[,] output = new string[arr.GetLength(0), arr.GetLength(1)];

  for (int i = 0; i < arr.GetLength(0); i++)
  {
    for (int j = 0; j < arr.GetLength(1); j++)
    {
      //If nothing in the cell, write a blank
      if (arr[i + 1, j + 1] == null)
      {
        output[i, j] = "";
        continue;
      }
      //else, write the output
      output[i, j] = arr[i + 1, j + 1].ToString();
    }
  }

  if (range != null)
    Marshal.ReleaseComObject(range);
  if (worksheet != null)
    Marshal.ReleaseComObject(worksheet);

  return output;
}
于 2012-08-06T18:09:06.170 回答