2013-05-27 6 views
3

У меня есть лист первенствовать, содержащий один столбец и нескольких строк, как:Текста столбца в Excel

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

Я пытаюсь создать новый Excel файл через мои C# код, но не получаю желаемый результат. В моем новом файле Excel мне нужно шесть столбцов с каждым столбцом, назначенным определенным диапазоном, например, для первого столбца 12, для второго 20 и т. Д. (Также включены пробелы). Я использовал метод text to column, но я не могу разобрать его на фиксированную ширину. Мой пример кода:

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. Но точное решение там не предусмотрено.

+0

Ohhh !! по крайней мере, через четыре дня у меня могло быть немного решения для моей проблемы, но нечего волноваться, я нашел выход. Это не так точно, как мне хотелось бы, но все равно решает мою цель. –

ответ

2

Фактически мне нужно было сначала преобразовать 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); 

Теперь убедитесь, чтобы закрыть все экземпляры COM-объекта, который вы создали в противном случае она будет создавать ад много в problem.Secondly в другой функции, я открыл свой временный файл Excel, и все данные в Dataset, а затем с помощью объекта Range и следующего способом:

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

Надеется, что это помогает другим сохранить свое время. Спасибо.

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