2011-11-17 24 views
6

Sử dụng apache POI ... Tôi đã sử dụng workbook.CreateCellStyle(), nếu sau một thời gian tôi cần xóa CellStyle đã tạo ... Làm thế nào để xóa nó khỏi sổ làm việc? Tôi có thể thấy nó vẫn còn ngay cả khi nó không được sử dụng.Apache POI xóa CellStyle khỏi sổ làm việc

Những gì tôi cần là một cái gì đó như workbook.deleteCellStyle (cellStyle.getIndex());

Trả lời

3

Đánh giá từ các nguồn phương pháp sau xóa CellStyles không sử dụng:

org.apache.poi.hssf.usermodel.HSSFOptimiser.optimiseCellStyles(HSSFWorkbook) 
+0

Có vẻ như nó nên thực hiện công việc ... nhưng việc chạy nó không thực sự làm gì cả! Tôi sẽ cố gắng gỡ lỗi lại sau. – AhHatem

1

Lấy tế bào và thiết NOTHING phong cách có thể làm việc:

HSSFRow hr= workBook.getSheet("SheetName").getRow(rowIndex); 
HSSFCell hc=hr.getCell(cellIndex); 
hc.setCellStyle(null); 

Vui lòng thử điều này có thể điều này sẽ làm việc cho bạn.

+1

Kiểu vẫn được lưu trong tệp. Sau khi tìm kiếm vài ngày, tôi cho rằng không có cách đơn giản nào để xóa kiểu khỏi sổ làm việc bằng cách sử dụng Apache POI. – user1581900

1

Bạn có thể giải quyết vấn đề bằng cách sao chép dữ liệu với bất kỳ ô được yêu cầu nào vào sổ làm việc mới được tạo. Kiểu tế bào "sống sót" đằng sau hậu trường dường như bị lỗi hoặc không được suy nghĩ kỹ.

+0

Đây không phải là lời khuyên tốt. Điều gì sẽ xảy ra nếu sách có từ 3 dữ liệu nặng trở lên và OP chỉ cần xóa một ô đơn lẻ? –

+1

"3 hoặc nhiều dữ liệu nặng" là gì? Và: Anh ta không phải là xóa các tế bào, anh ta muốn loại bỏ các tế bào không được quan tâm. Cách giải quyết khác là giải pháp thay thế và đây là một giải pháp, chứ không phải giải pháp, vì vậy: Nếu bạn có, hãy cho chúng tôi biết. – TheBlastOne

+0

Sự tồn tại của kiểu di động, trong khi sao chép các giá trị của các ô, là không có. Các phong cách sẽ bị bỏ lại phía sau. Điều đó có nghĩa là tôi sẽ cần tạo các kiểu mới trong sổ làm việc mới. Người quản lý cellstyle có thể giúp tôi với nhiệm vụ này. Tuy nhiên tôi lo lắng về hiệu suất. @Luiggi: Bạn nói đúng. Sẽ có những trường hợp không có kiểu nào bị xóa, nhưng tôi vẫn phải đảm bảo rằng không có kiểu nào không được sử dụng/sao chép. – user1581900

4

Kể từ r1391891, HSSFOptimiser cũng sẽ xóa các kiểu không sử dụng, ngoài việc xóa kiểu ô trùng lặp.

Vì vậy, lấy cho mình một đêm xây dựng/svn checkout xây dựng gần đây (hoặc chỉ cần chờ đợi cho việc phát hành 3,9-beta1 trong một tháng hoặc lâu hơn!), Và sau đó làm điều gì đó như:

NPOIFSFileSystem poifs = new NPOIFSFileSystem(new File("/path/to/excel/file.xls")); 
HSSFWorkbook wb = new HSSFWorkbook(poifs.getRoot()); 
HSSFOptimiser.optimiseCellStyles(wb); 

FileOutputStream fout = new FileoutputStream("optimised.xls"); 
wb.write(fout); 
fout.close() 

Sau đó, optimsed.xls sẽ không chứa kiểu ô trùng lặp và không có kiểu ô không được sử dụng. (Bạn có thể dễ dàng đặt bước tối ưu hóa ở phần cuối của việc tạo tệp, nếu nó chưa có sẵn)

Lưu ý - cách tiếp cận HSSFOptimiser sẽ chỉ hoạt động đối với các tệp .xls, không phải cho các tệp XSSF .xlsx. Chúng ta có thể khái quát các cách tiếp cận với công việc không quá nhiều, nhưng bây giờ nó HSSF chỉ ....

+1

Đây là phiên bản hữu ích và tăng áp của câu trả lời (quá chung chung) của tôi - +1. – TheBlastOne

+0

Cách tiếp cận này giải quyết chỉ một nửa vấn đề khiến tôi có định dạng OOXML (*. Xlsx files) bị ảnh hưởng. Mặt khác, không khó để chuyển đổi xlsx -> xls -> xlsx. Tôi nên thử nó và xem hiệu suất là gì. – user1581900

+0

@Gagravarr là có cách nào để làm điều này cho Xlsx ... ?? –

2

Không có phương pháp trực tiếp trong mã nguồn hiện tại:

Đây là cách phong cách được tạo ra :

public HSSFCellStyle createCellStyle() 
{ 
    ... 
    ExtendedFormatRecord xfr = workbook.createCellXF(); 
    short index = (short) (getNumCellStyles() - 1); 
    HSSFCellStyle style = new HSSFCellStyle(index, xfr, this); 
    return style; 
} 

với

public short getNumCellStyles() 
{ 
    return (short) workbook.getNumExFormats(); 
} 

và (trong InternalWorkbook)

public int getNumExFormats() { 
    ... 
    return numxfs; 
} 

và bằng sổ làm việc.createCellXF() giải quyết để:

public ExtendedFormatRecord createCellXF() { 
    ExtendedFormatRecord xf = createExtendedFormat(); 

    records.add(records.getXfpos()+1, xf); 
    records.setXfpos(records.getXfpos() + 1); 
    numxfs++; 
    return xf; 
} 

Vì vậy, những gì có thể từ HSSFWorkbook, là để gọi:

InternalWorkbook getWorkbook() { 
    return workbook; 
} 

và sau đó trên đối tượng InternalWorkbook:

public ExtendedFormatRecord getExFormatAt(int index) { 
    int xfptr = records.getXfpos() - (numxfs - 1); 

    xfptr += index; 
    ExtendedFormatRecord retval = 
    (ExtendedFormatRecord) records.get(xfptr); 

    return retval; 
} 

public void removeExFormatRecord(ExtendedFormatRecord rec) { 
    records.remove(rec); // this updates XfPos for us 
    numxfs--; 
} 

Vì vậy, để làm cho nó ngắn, từ bảng tính hàng đầu, như sau:

InternalWorkbook w = workbook.getWorkbook(); 
ExtendedFormatRecord record = w.getExFormatAt(index); 
w.removeExFormatRecord(record); 

Điều này tất cả đều rất kinh khủng :)

+0

Tôi nghĩ rằng có thể dẫn tôi đến một cái gì đó. Tôi chỉ cần xem qua ExtendedFormatRecord và dường như với tôi cả hai kiểu và các ô là ExtendedFormatRecords. Nếu tôi tìm ra số kiểu đúng trong chỉ mục này, tôi tin rằng tôi có thể xóa nó. Tuy nhiên, tôi sợ rằng tất cả các tham chiếu từ ô đến (đã loại bỏ) sẽ bị hỏng ... – user1581900

+0

Bạn cũng sẽ cần phải sửa các tham chiếu, nếu không mọi thứ sẽ bị vỡ khi bạn xáo trộn thứ tự các XF xung quanh bằng cách xóa . Hãy xem HSSFOptimiser để xem những gì cần phải làm! – Gagravarr

+0

Mặc dù đây không phải là câu trả lời đầy đủ cho câu hỏi của tôi, quá khứ sao chép đơn giản của mã nguồn poi đã chỉ cho tôi đúng hướng. Cảm ơn! – user1581900

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