2012-11-02 56 views
13

Tôi đang cố định dạng một số phạm vi bằng cách sử dụng tính năng Định dạng có điều kiện của EPPlus. Tôi đọc nhiều tài liệu nhưng không có nơi nào đề cập đến biểu thức định dạng có điều kiện.Định dạng có điều kiện bằng biểu thức sử dụng EPPlus

Tôi rất bối rối. Không biết cách sử dụng tính năng đó. Dưới đây là một số câu hỏi của tôi:

  1. Chúng ta có thể sử dụng nhiều phạm vi để đưa vào tham số ExcelAddress (như "H1: H17, L1: L17," AA1: AA17")
  2. Công thức được đưa vào tài sản Formula là bằng cách nào đó như Interop Excel hay không? (như chúng ta sử dụng "A1" để biểu diễn cho ô hiện để định dạng trong interop excel)
  3. bạn có thể cho tôi một mã chân bản demo nhỏ mà sử dụng biểu Conditional Formatting.

Cảm ơn bạn!

(Xin lỗi vì tiếng Anh xấu mà tôi đã viết)

Trả lời

28

tôi đã tìm ra giải pháp bằng bản thân mình. Hãy lấy một ví dụ mã:

ExcelAddress _formatRangeAddress = new ExcelAddress("B3:B10,D3:D10,F3:F10,H3:H10:J3:J10"); 
// fill WHITE color if previous cell or current cell is BLANK: 
// B3 is the current cell because the range _formatRangeAddress starts from B3. 
// OFFSET(B3,0,-1) returns the previous cell's value. It's excel function. 
string _statement = "IF(OR(ISBLANK(OFFSET(B3,0,-1)),ISBLANK(B3)),1,0)"; 
var _cond4 = sheet.ConditionalFormatting.AddExpression(_formatRangeAddress); 
_cond4.Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid; 
_cond4.Style.Fill.BackgroundColor.Color = Color.White; 
_cond4.Formula = _statement; 

// fill GREEN color if value of the current cell is greater than 
// or equals to value of the previous cell 
_statement = "IF(OFFSET(B3,0,-1)-B3<=0,1,0)"; 
var _cond1 = sheet.ConditionalFormatting.AddExpression(_formatRangeAddress); 
_cond1.Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid; 
_cond1.Style.Fill.BackgroundColor.Color = Color.Green; 
_cond1.Formula = _statement; 

// fill RED color if value of the current cell is less than 
// value of the previous cell 
_statement = "IF(OFFSET(B3,0,-1)-B3>0,1,0)"; 
var _cond3 = sheet.ConditionalFormatting.AddExpression(_formatRangeAddress); 
_cond3.Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid; 
_cond3.Style.Fill.BackgroundColor.Color = Color.Red; 
_cond3.Formula = _statement; 

Trong ví dụ trên,

  • _formatRangeAddress là phạm vi đó sẽ được áp dụng cho các dạng có điều kiện bởi sự biểu hiện. Ô đầu tiên trong phạm vi này sẽ được sử dụng trong công thức điều kiện. (B3).
  • _statement là công thức dùng để tính toán tình trạng này, chuỗi này không bắt đầu với dấu bằng (=) (chênh lệch điểm từ MS Excel), các tế bào được sử dụng để làm cho biểu thức là ô đầu tiên trong số _formatRangeAddress. (B3).

Hy vọng điều này hữu ích cho những người khác cần. -Han-

+0

bạn có thể cung cấp định dạng có điều kiện "Chứa" văn bản có điều kiện –

+1

Đây là hàm Excel. Tôi thấy rằng chúng sử dụng 'ISNUMBER' và' SEARCH' funcions.http://office.microsoft.com/en-001/excel-help/check-if-a-cell-contains-text-HP003056106.aspx – Han

+0

Tôi muốn sử dụng Định dạng có điều kiện trực tiếp trên Excel nhưng tôi không rõ ràng ' hiện tại' trên biểu thức của bạn. Bạn sử dụng như biểu thức 'IF (AND (ISBLANK (OFFSET (B3,0, -1)), ISBLANK (B3)), 1,0)' và, trong chú thích mã bạn nói '// điền vào màu WHITE nếu một trong ô trước đó hoặc ô hiện tại là BLANK: '. Tham chiếu tới ô 'hiện tại' ở đâu? Tôi chỉ thấy 'B3'. – jotapdiez

2

Có hỗ trợ định dạng có điều kiện trong phiên bản 3.1 beta của EPPlus.

Hãy nhìn vào các mã nguồn ở đây: http://epplus.codeplex.com/discussions/348196/

+0

Thực ra điều này không thực sự tập trung vào câu hỏi của tôi: ( – Han

0

Sau nhiều vệ tinh, tôi đã tìm cách tiếp cận linh hoạt và nhanh hơn để thực hiện việc này bằng LINQ và EPPlus. Tất cả những gì bạn cần làm là: thêm thuộc tính bổ sung vào danh sách của bạn để lưu các số hàng của Excel, và sau đó lấy các địa chỉ ô bằng cách sử dụng LINQ. Trong trường hợp này nó sẽ trông như thế này:

string sRng = string.Join(",", YourModel.Where(f => f.YourField == null) 
    .Select(a => "H" + a.iRow + ",L" + a.iRow + ",AA" + a.iRow)); // this address could be many pages and it works 

if (sRng.Length > 0) { 
    ws.Cells[sRng].Style.Fill.BackgroundColor.SetColor(System.Drawing.Color.Green); 
} 

Dưới đây là toàn bộ bài viết:

https://www.codeproject.com/Tips/1231992/Conditional-Formatting-in-Excel-with-LINQ-and-EPPl

Cũng thấy ở đây một ví dụ khác: https://stackoverflow.com/a/49022692/8216122 hy vọng điều này giúp ai đó trong tương lai.

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