在Excel中列出文本

我有一个Excel表,包含单列和多行像:

000500114673HY340216-00 CT TAPING WORK DTYPE-OSKF 245 TWB.TH/C 37990110000250000100 

我试图通过我的C#代码创build一个新的Excel文件,但没有得到所需的结果。 在我的新Excel文件中,我需要六列,每列分配一个特定的范围,比如第一列12,第二十二列等(空间也包括在内)。 我用文字列方法,但我不能parsing到固定的宽度。 我的代码示例是:

 xlAppNew = new Application(); xlAppNew.DisplayAlerts = true; workbooks = xlAppNew.Workbooks; workbook = workbooks.Open(@filepath, 0, true, 1, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0); xlWorkSheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets.get_Item(1); ((Range)xlAppNew.Cells[1, 1]).EntireColumn.TextToColumns(Type.Missing, Microsoft.Office.Interop.Excel.XlTextParsingType.xlFixedWidth, Microsoft.Office.Interop.Excel.XlTextQualifier.xlTextQualifierNone, Type.Missing, Type.Missing, Type.Missing, true, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing); 

我认为问题在于倒数第四个参数,我无法正确提供的fieldinfo对象,我也使用了数组对象,但是它产生了错误。 我从这个问题4945621帮助。 但是确切的解决办法不在那里提供。

其实我所要做的是首先将DAT文件转换为Excel,然后通过我的C#代码将其分成固定数量的列。 所以在我的第一步中,我所做的就是将DAT文件转换成一个Excel文件,该文件具有一个列,并将行数定义为我的临时Excel文件。

  xlAppNew1 = new Application(); xlAppNew1.DisplayAlerts = true; workbooks1 = xlAppNew1.Workbooks; workbook1 = workbooks1.Open(@filepath, 0, true, 1, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0); xlAppNew1.ActiveWorkbook.SaveAs(@filepathNew, -4143, "", "", false, false, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, missing, missing, missing, missing, missing); 

现在确保closures所有你创build的COM对象的实例,否则它会创build很多问题。其次,在另一个函数中,我打开了我的临时Excel文件,然后在数据集中的所有数据,然后在范围对象和以下方法:

  range = range.get_Resize(range.Rows.Count, 9); string[,] saRet = new string[range.Rows.Count, 9]; range.set_Value(Missing.Value, saRet); 

整个代码是这样的:

  xlAppNew = new Application(); xlAppNew.DisplayAlerts = true; workbooks = xlAppNew.Workbooks; workbook = workbooks.Open(@filepathnew, 0, true, 1, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0); xlWorkSheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets.get_Item(1); if (getExtension.ToLower() == ".xls") connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filepath_second + ";Extended Properties=\"Excel 8.0;HDR=YES;IMEX=1;\""; else connString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filepath_second + ";Extended Properties=Excel 12.0 Xml;HDR=Yes;IMEX=1;"; OleDbConnection con = new OleDbConnection(connString); con.Open(); System.Data.DataTable dtSheet = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); string tname = dtSheet.Rows[0]["TABLE_NAME"].ToString(); OleDbDataAdapter ad = new OleDbDataAdapter(@"Select * FROM [" + tname + "];", con); DataSet dset = new DataSet(); ad.Fill(dset); range = xlWorkSheet.UsedRange; range = range.get_Resize(range.Rows.Count, 9); //Create an array. string[,] saRet = new string[range.Rows.Count, 9]; //Fill the array. for (int iRow = 0; iRow < range.Rows.Count - 1; iRow++) { for (int iCol = 0; iCol < 9; iCol++) { switch (iCol) { case 0: saRet[iRow, iCol] = dset.Tables[0].Rows[iRow][0].ToString().Substring(3, 9);//iRow.ToString() + "|" + iCol.ToString(); break; case 1: saRet[iRow, iCol] = dset.Tables[0].Rows[iRow][0].ToString().Substring(12, 4); break; case 2: saRet[iRow, iCol] = dset.Tables[0].Rows[iRow][0].ToString().Substring(16, 18); break; case 3: saRet[iRow, iCol] = dset.Tables[0].Rows[iRow][0].ToString().Substring(34, 8); break; case 4: saRet[iRow, iCol] = dset.Tables[0].Rows[iRow][0].ToString().Substring(42, 4); break; case 5: saRet[iRow, iCol] = dset.Tables[0].Rows[iRow][0].ToString().Substring(46, 18); break; case 6: saRet[iRow, iCol] = dset.Tables[0].Rows[iRow][0].ToString().Substring(64, 40); break; case 7: saRet[iRow, iCol] = dset.Tables[0].Rows[iRow][0].ToString().Substring(104, 3); break; case 8: saRet[iRow, iCol] = dset.Tables[0].Rows[iRow][0].ToString().Substring(107, 5); break; } } } //Set the range value to the array. range.set_Value(Missing.Value, saRet); FieldInfo myf = typeof(MyNewService).GetField("saRet");//Fieldinfo object is also an important part //********************** ((Range)xlAppNew.Cells[1, 1]).EntireColumn.TextToColumns(Type.Missing, Microsoft.Office.Interop.Excel.XlTextParsingType.xlFixedWidth, Microsoft.Office.Interop.Excel.XlTextQualifier.xlTextQualifierNone, Type.Missing, Type.Missing, Type.Missing, true, Type.Missing, Type.Missing, Type.Missing, myf, Type.Missing, Type.Missing, Type.Missing); xlAppNew.ActiveWorkbook.SaveAs(@temp_path, -4143, "", "", false, false, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, missing, missing, missing, missing, missing); 

希望能帮助别人节省时间。谢谢。