2010-05-21 5 views
50

Dưới đây là mã tôi đang sử dụng để tải dữ liệu vào trang tính Excel, nhưng tôi xem xét tự động định kích thước cột sau khi dữ liệu được tải. Có ai biết cách tốt nhất để tự động kích thước các cột?Làm cách nào để tự động kích thước cột thông qua các đối tượng interop Excel?

using Microsoft.Office.Interop; 

public class ExportReport 
{ 
    public void Export() 
    { 
     Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application(); 
     Excel.Workbook wb; 
     Excel.Worksheet ws; 
     Excel.Range aRange; 
     object m = Type.Missing; 
     string[,] data; 
     string errorMessage = string.Empty; 
     try 
     { 
      if (excelApp == null) 
       throw new Exception("EXCEL could not be started."); 

      // Create the workbook and worksheet. 
      wb = excelApp.Workbooks.Add(Office.Excel.XlWBATemplate.xlWBATWorksheet); 
      ws = (Office.Excel.Worksheet)wb.Worksheets[1]; 

      if (ws == null) 
       throw new Exception("Could not create worksheet."); 

      // Set the range to fill. 
      aRange = ws.get_Range("A1", "E100"); 

      if (aRange == null) 
       throw new Exception("Could not get a range."); 

      // Load the column headers. 
      data = new string[100, 5]; 
      data[0, 0] = "Column 1"; 
      data[0, 1] = "Column 2"; 
      data[0, 2] = "Column 3"; 
      data[0, 3] = "Column 4"; 
      data[0, 4] = "Column 5"; 

      // Load the data. 
      for (int row = 1; row < 100; row++) 
      { 
       for (int col = 0; col < 5; col++) 
       { 
        data[row, col] = "STUFF"; 
       } 
      } 

      // Save all data to the worksheet. 
      aRange.set_Value(m, data); 
      // Atuo size columns 
      // TODO: Add Code to auto size columns. 

      // Save the file. 
      wb.SaveAs("C:\Test.xls", Office.Excel.XlFileFormat.xlExcel8, m, m, m, m, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, m, m, m, m, m); 
      // Close the file. 
      wb.Close(false, false, m); 
     } 
     catch (Exception) { } 
     finally 
     { 
      // Close the connection. 
      cmd.Close(); 
      // Close Excel. 
      excelApp.Quit(); 
     } 
    } 
} 

Trả lời

82

Thêm này vào thời điểm TODO của bạn:

aRange.Columns.AutoFit();

+1

Ngoài ra còn có 'aRange.Rows.AutoFit()'. – krillgar

+6

nó không hoạt động cho tôi. – levi

+4

Sử dụng câu trả lời @nawfal: aRange.EntireColumn.AutoFit(); –

23

Điều này có thể là quá muộn nhưng nếu bạn thêm

worksheet.Columns.AutoFit(); 

hoặc

worksheet.Rows.AutoFit(); 

nó cũng làm việc.

+0

Tôi thích điều này tốt hơn. Điều này hữu ích hơn nếu bạn không quan tâm đến các cột cụ thể cần được thay đổi kích thước và chỉ muốn toàn bộ trang tính được tự động sửa. – ThePersonWithoutC

2

Phương thức này mở tệp đã tạo excel, Tự động điền tất cả các cột của tất cả các trang tính dựa trên Hàng thứ ba. Như bạn thấy Phạm vi được chọn Từ "A3 đến K3" trong excel.

public static void AutoFitExcelSheets() 
    { 
     Microsoft.Office.Interop.Excel.Application _excel = null; 
     Microsoft.Office.Interop.Excel.Workbook excelWorkbook = null; 
     try 
     { 
      string ExcelPath = ApplicationData.PATH_EXCEL_FILE; 
      _excel = new Microsoft.Office.Interop.Excel.Application(); 
      _excel.Visible = false; 
      object readOnly = false; 
      object isVisible = true; 
      object missing = System.Reflection.Missing.Value; 

      excelWorkbook = _excel.Workbooks.Open(ExcelPath, 
        0, false, 5, "", "", false, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "", 
        true, false, 0, true, false, false); 
      Microsoft.Office.Interop.Excel.Sheets excelSheets = excelWorkbook.Worksheets; 
      foreach (Microsoft.Office.Interop.Excel.Worksheet currentSheet in excelSheets) 
      { 
       string Name = currentSheet.Name; 
       Microsoft.Office.Interop.Excel.Worksheet excelWorksheet = (Microsoft.Office.Interop.Excel.Worksheet)excelSheets.get_Item(Name); 
       Microsoft.Office.Interop.Excel.Range excelCells = 
(Microsoft.Office.Interop.Excel.Range)excelWorksheet.get_Range("A3", "K3"); 
       excelCells.Columns.AutoFit(); 
      } 
     } 
     catch (Exception ex) 
     { 
      ProjectLog.AddError("EXCEL ERROR: Can not AutoFit: " + ex.Message); 
     } 
     finally 
     { 
      excelWorkbook.Close(true, Type.Missing, Type.Missing); 
      GC.Collect(); 
      GC.WaitForPendingFinalizers(); 
      releaseObject(excelWorkbook); 
      releaseObject(_excel); 
     } 
    }