2012-03-29 9 views
1

データテーブルをxlsファイルにエクスポートしようとしています。私がしたい、特定の理由から.NETを使用してXLS列のデータ型を変更する方法

using ExcelIt = Microsoft.Office.Interop.Excel; 

protected void Export2xlsWorkBook(string filename) 
     { 
      if (filename != string.Empty) 
      { 
       if (filename.EndsWith(".xls")) 
        filename = txtNewFileName.Text + ".xls"; 
      } 
      else 
       filename = "NewFile.xls"; 

      filename = "C:\\Documents and Settings\\My Documents\\Exported XLS\\" + filename; 

      ExcelIt.Application objXL = new ExcelIt.Application(); 
      ExcelIt.Workbook oWB; 
      ExcelIt.Worksheet oSheet; 
      ExcelIt.Range oRange; 

      objXL.Visible = true; 
      objXL.DisplayAlerts = false; 

      oWB = objXL.Workbooks.Add(Missing.Value); 

      DataTable dt = CreateDataTable(); 

      oSheet = (ExcelIt.Worksheet)oWB.ActiveSheet; 
      oSheet.Name = "Exported Table"; 

      int rowCount = 1; 
      foreach (DataRow dr in dt.Rows) 
      { 
       rowCount += 1; 
       for (int i = 1; i < dt.Columns.Count + 1; i++) 
       { 
        if (rowCount == 2) 
        { 
         oSheet.Cells[1, i] = dt.Columns[i - 1].ColumnName; 
        } 
        oSheet.Cells[rowCount, i] = dr[i - 1].ToString(); 
       } 
      } 

      oRange = oSheet.get_Range(oSheet.Cells[1, 1], 
          oSheet.Cells[rowCount, dt.Columns.Count]); 

      oRange.EntireColumn.AutoFit(); 

      oRange = oSheet.get_Range(oSheet.Cells[1, 2], oSheet.Cells[rowCount + 10, dt.Columns.Count]); 

      oSheet.Protection.AllowEditRanges.Add("NonePK", oRange, Missing.Value); 

      oRange = oSheet.get_Range(oSheet.Cells[rowCount + 1, 1], oSheet.Cells[rowCount + 10, 1]); 

      oSheet.Protection.AllowEditRanges.Add("PKEmptyRow", oRange, Missing.Value); 

      oSheet._Protect(Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value); 

      oSheet = null; 
      oRange = null; 

      oWB.SaveAs(filename, ExcelIt.XlFileFormat.xlWorkbookNormal, 
       Missing.Value, Missing.Value, Missing.Value, Missing.Value, 
       ExcelIt.XlSaveAsAccessMode.xlExclusive, 
       Missing.Value, Missing.Value, Missing.Value, 
       Missing.Value, Missing.Value); 

      oWB.Close(Missing.Value, Missing.Value, Missing.Value); 
      oWB = null; 
      objXL.Quit(); 

      GC.WaitForPendingFinalizers(); 
      GC.Collect(); 
      GC.WaitForPendingFinalizers(); 
      GC.Collect(); 
     } 

:以下は私のコードであるすべての列を設定し をテキストに型。 現在、私は何も指定しなかったので、データ型は代わりに「一般」に設定されます。

誰かがこれを達成する方法についてアドバイスできますか?あなたが使用することができます よろしく

+1

私はあなたがCOMのクリーンアップをしないことに気づきました。 Interopのすべての参照でこれを行います。それが助けて欲しい! if(writeRange!= null) { Marshal.FinalReleaseComObject(writeRange); writeRange = null; } –

答えて

2

Range.NumberFormat Property

Range usedRange = oSheet.UsedRange; 
usedRange.NumberFormat = "@"; 
+0

「@」とはどういう意味ですか?そして、どのように範囲フォーマットが 'Text'にあることを保証するのですか? – rofans91

+0

'@'はテキストセル形式です。あなたはこれをマクロで見ることができます。これはExcelで記録されています – turbanoff

+1

@turbanoffあなたはDelphi開発者ですか? :) –

関連する問題