2012-10-31 31 views
11

Tôi đang sử dụng Apache POI để xuất dữ liệu sang tệp .xlsx và tôi muốn tạo kiểu cho một số hàng và ô chứa trong tệp.Apache POI, tạo ô mới ghi đè kiểu hàng

Tôi đang sử dụng XSSF vì tệp sẽ được đọc trong Excel 2007+. Về cơ bản, vấn đề của tôi là tôi đang cố gắng thiết lập một kiểu hàng như trong ví dụ sau, thiết lập màu nền trước màu đen cho toàn bộ hàng tại chỉ mục 0. Nó hoạt động tốt, nhưng bất cứ khi nào tôi tạo một ô mới , ô mới được tạo không có kiểu, như thể nó ghi đè kiểu hàng tôi đã chỉ định.

Dưới đây là một đoạn mã để chứng minh những gì tôi đang làm:

XSSFWorkbook wb = new XSSFWorkbook(); 
XSSFSheet sheet = wb.createSheet("mySheet"); 
XSSFRow row = sheet.createRow(0); 

XSSFCellStyle myStyle = wb.createCellStyle();   

myStyle.setFillForegroundColor(new XSSFColor(new Color(255, 255, 255))); 
myStyle.setFillPattern(CellStyle.SOLID_FOREGROUND); 

row.setRowStyle(myStyle); //This works, the whole row is now black 

row.createCell(0); // This cell doesn't have a style, the rest of the line stays stylized 
row.getCell(0).setCellValue("Test"); 

Tôi cũng đã cố gắng * row.createCell (0, Cell.CELL_TYPE_STRING); *, nhưng nó đã không thay đổi bất cứ điều gì.

Cách chính xác để hoàn thành những gì tôi muốn làm là gì? Tôi muốn làm theo cách này vì vậy tôi không phải thiết lập phong cách của mỗi tế bào sau khi tạo ra nó vì tất cả các ô trên cùng một hàng đều có cùng kiểu.

+0

thử gọi _row.createCell() _ trước _row.setRowStyle (myStyle); _ –

+1

Ừ Tôi đã thử điều đó và thứ tự không quan trọng có vẻ như –

+0

_row.setCellValue ("Test"); _ cho tôi một kiểm tra lỗi thời gian biên dịch! –

Trả lời

10

Đặt kiểu thành ô mới được tạo, ví dụ: bên dưới:

XSSFCell newCell = row.createCell(0); 
    newCell.setCellStyle(myStyle); 
+8

Tôi biết tôi có thể làm điều đó như tôi đã đề cập trong câu hỏi của mình, nhưng tôi thực sự không biết điểm thiết lập kiểu hàng là gì nếu tôi phải tự thiết lập kiểu của mỗi ô sau đó. –

+1

@AdamSmith: Tôi nghi ngờ liệu ô mới được tạo có kế thừa các thuộc tính từ cha mẹ hay không. –

+0

Tôi đoán tôi sẽ phải làm theo cách này sau đó. Tôi nghĩ rằng nó làm việc như khi tôi làm điều đó bằng tay trong Excel (thiết lập một màu cho toàn bộ hàng, sau đó khi bạn đặt dữ liệu trong một tế bào theo phong cách). Cảm ơn câu trả lời của bạn! Tôi đoán những gì tôi yêu cầu là không thể. –

9

Ngay cả khi bạn tạo hàng có kiểu, nó sẽ không ảnh hưởng đến ô được tạo của nó. Ô tạo có kiểu ô riêng của chúng. row style sẽ không tự động ghi đè lên cell style. Nếu bạn muốn sử dụng kiểu hàng trong ô, bạn phải đặt lại.

Thậm chí nếu bạn đặt row style ở cuối, nó sẽ không ảnh hưởng đến ô.

Ví dụ

CreationHelper createHelper = wb.getCreationHelper(); 
Sheet sheet = wb.createSheet("new sheet"); 
Row r = sheet.createRow(0); 
r.setRowStyle(rowStyle); 

Cell c1 = r.createCell(0); 
c1.setCellValue("Test 1"); 
c1.setCellStyle(rowStyle); 
+2

Vậy thì điểm của 'setRowStyle' là gì? –

+0

@ mateus-viccari Giả sử 'setRowStyle' hoạt động giống như' setDefaultColumnStyle': Điều này thực sự đặt kiểu (mặc định) cho các ô được thêm thủ công * sau khi sổ làm việc đã được xuất * (tức là bởi một con người). – Auke

0

Tôi đồng ý rằng "setRowStyle" không hoạt động như nó phải được.

Tôi tạo ra chức năng của riêng mình cho áp dụng một phong cách cho một phạm vi (có thể là một hàng hoặc nhiều hàng)

public void applyStyleToRange(Sheet sheet, CellStyle style, int rowStart, int colStart, int rowEnd, int colEnd) { 
    for (int r = rowStart; r <= rowEnd; r++) { 
     for (int c = colStart; c <= colEnd; c++) { 
      Row row = sheet.getRow(r); 

      if (row != null) { 
       Cell cell = row.getCell(c); 

       if (cell != null) { 
        cell.setCellStyle(style); 
       } 
      } 
     } 
    } 
} 
Các vấn đề liên quan