2017-08-28 42 views
0

System.IndexOutOfRangeException:索引超出了数组的范围。C#将XLS保存为CSV:索引超出了数组的范围

如何解决这个错误?

任何人都可以知道吗?

下面我的编码......当执行它产生错误

System.IndexOutOfRangeException指数是阵列

的边界之外,只有在尝试处理这个C​​SV文件:

enter image description here

相反,如果试图处理此CSV文件我没有错误: enter image description here

Excel.IExcelDataReader excelReader = Excel.ExcelReaderFactory.CreateBinaryReader(stream); 
DataSet result = excelReader.AsDataSet(); 
excelReader.Close(); 
result.Tables[0].TableName.ToString(); 
string csvData = ""; 
int row_no = 0; 
int ind = 0; 

while (row_no < result.Tables[ind].Rows.Count) 
{ 
    for (int i = 0; i < result.Tables[ind].Columns.Count; i++) 
    { 
     csvData += result.Tables[ind].Rows[row_no][i].ToString() + "|"; 
    } 

    row_no++; 
    csvData += "\n"; 
} 

keys = GetUniqueKey(12).ToUpper(); 
output = System.Web.HttpContext.Current.Server.MapPath("/public/" + keys.ToString() + ".csv"); 
StreamWriter csv = new StreamWriter(@output, false); 
csv.Write(csvData); 
csv.Close(); 
csv.Dispose(); 

string toCheck; 
using (var fs = new FileStream(output, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 
using (var sr = new StreamReader(fs, Encoding.Default)) 
{ 
    toCheck = sr.ReadToEnd(); 
    if (toCheck.Contains("ColumnAAA") == false) 
    { 
     ////Start add new column 
     int posNewColumn = 2; 
     string[] CSVDump = File.ReadAllLines(output); 
     List<List<string>> CSV = CSVDump.Select(x => x.Split('|').ToList()).ToList(); 
     for (int i = 0; i < CSV.Count; i++) 
     { 
      if (CSV[i].Count > posNewColumn) 
      { 
       CSV[i].Insert(posNewColumn, i == 0 ? "ColumnAAA" : "ColumnAAA"); 
      } 
      else 
      { 
       CSV[i].Add(i == 0 ? "ColumnAAA" : "ColumnAAA"); 
      } 
     } 
     File.WriteAllLines(output, CSV.Select(x => string.Join("|", x))); 
     sr.Close(); 
     ////End add new column 
    } 
} 

编辑#01

的问题是在这行代码隐藏。

代码打印正确的行数,但我有错误时尝试打印和斯普利特列数:

lines = File.ReadAllLines(System.Web.HttpContext.Current.Server.MapPath("/public/" + keys.ToString() + ".csv")); 
rows = lines.Count(); 
columns = lines[23].Split('|').Count(); 

Response.Write("Number of rows/columns = " + rows.ToString() + "/" + columns.ToString()); 
Response.End(); 
+0

您是否尝试过使用调试器?我建议找到发生此错误的代码行。之后,解决问题将更加容易。 – Ilya

+0

@伊利亚感谢您的回复,请在我的第一个问题中查看**编辑#01 **, –

回答

0

试试这个:

lines = File.ReadAllLines(System.Web.HttpContext.Current.Server.MapPath("/public/" + keys.ToString() + ".csv")); 
rows = lines.Count(); 

int i = 0; 
foreach (string line in lines) 
{ 
    string[] parts = line.Split('|'); 
    foreach (string part in parts) 
    { 
     columns = parts.Count(); 
    } 
    i++; 
} 

Response.Write("Number of rows/columns = " + rows.ToString() + "/" + columns.ToString()); 
Response.End();