2010-07-22 37 views
27

Tôi xuất một DataTable sang tệp Excel bằng cách sử dụng văn phòng interop. Vấn đề là, Excel không nhận ra ngày như vậy, nhưng thay vào đó nó hiển thị số. Trong trường hợp khác, tôi chuyển một chuỗi mà sau đó nó nhận ra là một ngày. Trong cả hai trường hợp, dữ liệu bị sai lệch.Cách tạo định dạng ngày chính xác khi ghi dữ liệu vào Excel

Tôi đã thử NumberFormat @ được cho là lưu trữ ô ở định dạng văn bản nhưng cũng không hoạt động.

  Application app = new Application(); 
      app.Visible = false; 
      app.ScreenUpdating = false; 
      app.DisplayAlerts = false; 
      app.EnableAnimations = false; 
      app.EnableAutoComplete = false; 
      app.EnableSound = false; 
      app.EnableTipWizard = false; 
      app.ErrorCheckingOptions.BackgroundChecking = false; 

      Workbook wb = app.Workbooks.Add(XlWBATemplate.xlWBATWorksheet); 
      Worksheet ws = (Worksheet)wb.Worksheets[1]; 

      for (int j = 0; j < dt.Rows.Count; j++) 
      { 
       for (int i = 0; i < dt.Columns.Count; i++) 
       { 
        Range rng = ws.Cells[j+2, i+1]as Range; 
        rng.Value2 = dt.Rows[j][i].ToString(); 
        rng.NumberFormat = "@"; 
       } 
      }   

      wb.SaveAs(filename, Missing.Value, Missing.Value, Missing.Value, Missing.Value, 
        Missing.Value, XlSaveAsAccessMode.xlExclusive, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value); 

      wb.Close(false, Missing.Value, Missing.Value);    

      app.Workbooks.Close(); 
      app.Application.Quit(); 
      app.Quit();  
      System.Runtime.InteropServices.Marshal.ReleaseComObject(ws); 
      System.Runtime.InteropServices.Marshal.ReleaseComObject(wb); 
      System.Runtime.InteropServices.Marshal.ReleaseComObject(app); 
      ws = null; 
      wb = null; 
      app = null; 
      GC.Collect(); 

Tại sao NumberFormat của tôi không hoạt động? Textformat có nên hiển thị mọi thứ giống như tôi đặt nó không?

Trả lời

31

Bạn đã thử định dạng toàn bộ cột làm cột ngày chưa? Một cái gì đó như thế này:

Range rg = (Excel.Range)worksheetobject.Cells[1,1]; 
rg.EntireColumn.NumberFormat = "MM/DD/YYYY"; 

Một điều khác bạn có thể thử sẽ được đặt một đánh dấu duy nhất trước khi biểu thức chuỗi trước khi tải văn bản vào tế bào Excel (không chắc chắn nếu có vấn đề hay không, nhưng nó hoạt động văn bản khi gõ trực tiếp vào một ô).

+0

Định dạng từng ô riêng biệt sẽ không khác nhau. Làm thế nào tôi có thể định dạng chính xác mọi thứ dưới dạng văn bản? – codymanix

+0

Nếu bạn muốn Excel coi cột đó là cột ngày tháng, nó thực sự phải có định dạng ngày, nếu không thì những điều kỳ lạ sẽ xảy ra mà bạn đã trải qua. Tuy nhiên, bạn có thể tham khảo bản chỉnh sửa mới nhất của tôi để có cách giải quyết khác có thể. – dcp

7

Hãy thử sử dụng

DateTime.ToOADate() 

Và đặt đó như là một đôi trong tế bào. Có thể có vấn đề với Excel trên hệ thống Mac (nó sử dụng một datetime khác nhau -> chuyển đổi kép), nhưng nó sẽ làm việc tốt cho hầu hết các trường hợp.

Hy vọng điều này sẽ hữu ích.

+0

Tại sao @ của tôi không hoạt động? Tôi muốn mọi thứ hiển thị giống như tôi đã đặt nó vào. – codymanix

+0

Giải pháp tốt ... mọi thứ khác đều thất bại! – Sheridan

+0

Upvote! Làm việc khi mọi thứ khác thất bại! –

2

Tôi biết câu hỏi này là cũ nhưng populating tế bào Excell với ngày qua VSTO có một vài gotchas.

tôi thấy Formula của không làm việc vào những ngày với định dạng yyyy-mmm-dd - mặc dù các tế bào đã NGÀY FORMAT! Bạn phải dịch Ngày tháng sang định dạng dd/mm/yyyy để sử dụng trong công thức.

Ví dụ những ngày tôi bị trở về từ SQL Analysis Server và tôi phải lật chúng và sau đó định dạng chúng:

using (var dateRn = xlApp.Range["A1"].WithComCleanup()) 
{ 
    dateRn.Resource.Value2 = Convert.ToDateTime(dateRn.Resource.Value2).ToString("dd-MMM-yyyy"); 
} 


using (var rn = xlApp.Range["A1:A10"].WithComCleanup()) 
{ 
    rn.Resource.Select(); 
    rn.Resource.NumberFormat = "d-mmm-yyyy;@"; 
} 

Nếu công thức bằng cách sử dụng Ngày không hoạt động - công thức trong ô C4 giống như C3:

enter image description here

1

Câu hỏi cũ nhưng vẫn phù hợp.Tôi đã tạo ra một từ điển mà được định dạng datetime phù hợp với từng khu vực, đây là lớp helper tôi tạo ra:

https://github.com/anakic/ExcelDateTimeFormatHelper/blob/master/FormatHelper.cs

FWIW đây là cách tôi đi về nó:

  1. mở excel , nhập thủ công ngày giờ vào ô đầu tiên của sổ làm việc
  2. mở hộp thoại vùng trong bảng điều khiển
  3. sử dụng Spy để tìm ra HWND của vùng kết hợp và nút áp dụng để tôi có thể sử dụng SetFore groundWindow và SendKey để thay đổi khu vực (không thể tìm cách thay đổi vùng thông qua API Windows)
  4. lặp qua tất cả các vùng và cho mỗi vùng yêu cầu Excel cho NumberFormat của ô chứa ngày, lưu dữ liệu này vào một tập tin
+0

Đó có lẽ không phải là câu trả lời mà người hỏi có trong tâm trí, nhưng tôi thấy nó rất hữu ích (nhưng tôi hy vọng có một giải pháp thẳng tiến hơn ...). Cảm ơn bạn đã chia sẻ mã của mình! – habakuk

+1

Vâng, tôi cũng đang tìm kiếm một giải pháp đơn giản hơn nhưng sau một vài giờ đồng hồ, nó kết luận không chỉ có một. Excel không cho thấy cách định dạng ngày tháng bất khả tri theo vùng. Tôi đã đăng bài này vì câu trả lời được chấp nhận không tính đến điều này; nó hoạt động tốt cho tiếng Anh và hầu hết các nền văn hóa khác nhưng sẽ thất bại cho ví dụ Đức, Pháp và nhiều vùng khác. Yeah, có lẽ không phải là câu trả lời mà OP xứng đáng, nhưng câu trả lời anh ấy cần :) – anakic

0

này đã làm việc cho tôi:

hoja_trabajo.Cells[i + 2, j + 1] = fecha.ToString("dd-MMM-yyyy").Replace(".", ""); 
0

này đã làm việc cho tôi:

sheet.Cells[currentRow, ++currentColumn] = "'" + theDate.ToString("MM/dd/yy"); 

Lưu ý đánh dấu m hòm được thêm trước ngày.

Các vấn đề liên quan