2011-10-24 42 views

Trả lời

21
WorkbookStylesPart sp = workbookPart.AddNewPart<WorkbookStylesPart>(); 

Tạo một kiểu,

sp.Stylesheet = new Stylesheet(); 

Tạo một numberingformat,

sp.Stylesheet.NumberingFormats = new NumberingFormats(); 
// #.##% is also Excel style index 1 


NumberingFormat nf2decimal = new NumberingFormat(); 
nf2decimal.NumberFormatId = UInt32Value.FromUInt32(3453); 
nf2decimal.FormatCode = StringValue.FromString("0.0%"); 
sp.Stylesheet.NumberingFormat.Append(nf2decimal); 

Tạo một dạng tế bào và áp dụng các định dạng đánh số id

cellFormat = new CellFormat(); 
cellFormat.FontId = 0; 
cellFormat.FillId = 0; 
cellFormat.BorderId = 0; 
cellFormat.FormatId = 0; 
cellFormat.NumberFormatId = nf2decimal.NumberFormatId; 
cellFormat.ApplyNumberFormat = BooleanValue.FromBoolean(true); 
cellFormat.ApplyFont = true; 

//append cell format for cells of header row 
sp.Stylesheet.CellFormats.AppendChild<CellFormat>(cellFormat); 


//update font count 
sp.Stylesheet.CellFormats.Count = UInt32Value.FromUInt32((uint)sp.Stylesheet.CellFormats.ChildElements.Count); 


//save the changes to the style sheet part 
sp.Stylesheet.Save(); 

và khi bạn thêm giá trị cho các tế bào có hereonversion đang trung tâm sau đây và áp dụng các chỉ số phong cách trong trường hợp của tôi có ba chỉ số phong cách do đó chỉ số 3 là chỉ số tỷ lệ phần trăm của tôi tức là 2 kể từ khi các chỉ mục bắt đầu từ 0

string val = Convert.ToString(Convert.ToDecimal(value)/100); 
Cell cell = new Cell(); 
cell.DataType = new EnumValue<CellValues>(CellValues.Number); 
cell.CellValue = new CellValue(val); 
cell.StyleIndex = 2; 
row.Append(cell); 
+0

Luồng này hoạt động vì chúng tôi có thể có bất kỳ định dạng ô nào bằng cách sử dụng quy trình này. Cảm ơn ssyladin – Selwyn

+0

Đừng lo lắng. Trên thực tế chi tiêu ~ 30 phút cố gắng thực hiện định dạng "thủ công" chỉ với OpenXML và cuối cùng đã từ bỏ. Giữ trên một bảng tính bị hỏng. Vì vậy, đây là một câu trả lời tốt cho tôi, vì nó giúp tránh phụ thuộc thư viện bên ngoài. – jklemmack

+1

Nhận xét của bạn về chỉ mục kiểu Excel có nghĩa là, nếu bạn muốn sử dụng kiểu dáng phần trăm Excel mặc định, bạn không cần thêm định dạng mới, chỉ cần đặt ô thành chỉ mục kiểu 1? – cidthecoatrack

14

Rất tiếc, không có câu trả lời thẳng về phía trước. Nếu bạn tải xuống Công cụ Năng suất OpenXML cho Microsoft Office, bạn có thể mổ xẻ một bảng tính đơn giản và xem cách định dạng số. Để làm được chỉ là những gì bạn muốn, bạn sẽ cần phải:

  • Tạo một StyleSheet
  • Thêm một NumberFormat mới với định nghĩa tùy chỉnh của bạn
  • Tạo một CellStyleFormat, hoàn chỉnh với biên giới, Điền, Font tất cả các định nghĩa, ngoài vào NumberFormat phía trên
  • Tạo một ô định dạng ô, tham chiếu đến các số
  • Cuối cùng, đặt StyleType của ô thành ID của CellFormat sử dụng NumberFormat.

WHEW!

Một tùy chọn tốt hơn là xem xét ClosedXML theo số http://closedxml.codeplex.com/ (tên khủng khiếp). Đó là một thư viện mã nguồn mở (KHÔNG GPL! - kiểm tra giấy phép) đặt các phần mở rộng hữu ích trên OpenXML. Để định dạng một tế bào của một bảng tính, bạn muốn thay vì làm:

worksheet.Cell(row, col).Value = "0.036"; 
worksheet.Cell(row, col).Style.NumberFormat.Format = "0.0%"; 

(từ http://closedxml.codeplex.com/wikipage?title=Styles%20-%20NumberFormat&referringTitle=Documentation)


CẬP NHẬT ClosedXML đã chuyển sang GitHub tại https://github.com/ClosedXML/ClosedXML

+0

tính năng này có thể hoạt động, tuy nhiên, yêu cầu bổ sung bên thứ ba, không phải là OpenXml 'đơn giản'. – fcm

4

Excel chứa được xác định trước các định dạng để định dạng chuỗi theo nhiều cách khác nhau. Thuộc tính s trên phần tử ô sẽ tham chiếu đến kiểu sẽ tham chiếu đến định dạng số tương ứng với định dạng phần trăm bạn muốn. Xem số question/answer để biết thêm thông tin.

Đây là đối tượng CellFormat bạn sẽ cần phải tạo để có mặt nạ 0,00% được áp dụng cho số của bạn. Trong trường hợp này, bạn muốn số lượng định dạng được xác định trước 10 hay 0.00%:

CellFormat cellFormat1 = new CellFormat(){ NumberFormatId = (UInt32Value)10U, FontId = (UInt32Value)0U, FillId = (UInt32Value)0U, BorderId = (UInt32Value)0U, FormatId = (UInt32Value)0U, ApplyNumberFormat = true }; 

Đây là một cách nhanh chóng để chèn CellFormat vào bảng tính:

CellFormats cellFormats = workbookPart.WorkbookStylesPart.Stylesheet.Elements<CellFormats>().First(); 
cellFormats.Append(cellFormat); 
uint styleIndex = (uint)cellFormats.Count++; 

Sau đó bạn sẽ cần phải nhận được ô có 3.6 trong nó và đặt nó là s thuộc tính (StyleIndex) sang định dạng tế bào mới được chèn vào:

Cell cell = workSheetPart.Worksheet.Descendants<Cell>().SingleOrDefault(c => cellAddress.Equals("A1")); 
cell.StyleIndex = styleIndex; 
2

Bạn có thể làm điều đó một cách đơn giản. Nếu bạn muốn áp dụng nó trên tế bào đơn lẻ sau đó làm điều này,

worksheet.Cell(9, 10).Style.NumberFormat.Format = "#,##0.00\\%"; 

Và nếu bạn muốn áp dụng nó trên một loạt các tế bào sau đó làm điều này,

worksheet.Range(9, 10, 15, 10).Style.NumberFormat.Format = "#,##0.00\\%"; 

bạn cũng có thể tìm thêm các định dạng Here và bạn cũng có thể tìm thấy tương tự từ Excel.

+1

Đây không phải là OpenXml như được nêu trong câu hỏi. – fcm

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