2012-11-16 10 views
6

Sử dụng Apache POI, tôi có thể tìm thấy một loạt tên:Định nghĩa lại tên Excel Dải sau đó Save sử dụng Apache POI

XSSFName[] ranges = new XSSFName[workbook.getNumberOfNames()]; 
for (int i = 0; i < _wb.getNumberOfNames(); i++) 
    ranges[i] = workbook.getNameAt(i); 

Với điều đó, tôi có thể di một AreaReference:

AreaReference area = new AreaReference(ranges[0].getRefersToFormula()); 

Và rồi cuối cùng tôi có thể nhận được tất cả các ô trong phạm vi đó:

CellReference[] cells = area.getAllReferencedCells(); 

đó là tất cả hoạt động tốt. Burt Tôi có một trường hợp sử dụng, nơi tôi phải xác định lại khu vực mà phạm vi bao gồm. Có cách nào làm được việc này không? Tôi nhận thấy rằng phương thức range.getRefersToFormula() trả về một String, giống như MySheet!$A$1:$B$8. Có một số range.setRefersToFormula(String formula), nhưng tôi phải tin rằng có một cách khác ngoài việc phải viết một trình phân tích cú pháp công thức excel cho riêng mình. Không có cách nào để tạo ra một AreaReference với một thiết lập để tham khảo Cell của một cái gì đó loại an toàn hơn? Tôi có thực sự phải tạo ra một String để đại diện cho phạm vi mới không? Tôi nghĩ rằng sẽ có API ở đâu đó để giúp tôi với điều này nhưng tôi dường như không thể tìm thấy nó.

Cập nhật

Tôi tìm thấy một số API, nhưng nó dường như không làm việc, ít nhất là nó không tiết kiệm đúng cách. Đây là những gì tôi đã làm.

AreaReference newArea = new AreaReference(firstCell, lastCell); 
ranges[0].setRefersToFormula(newArea.formatAsString()) 

Dường như đặt công thức chính xác, nhưng khi tôi phát trực tuyến sổ làm việc ra đĩa, phạm vi hoàn toàn sai.

Trả lời

7

bạn có thể cập nhật Tham chiếu hiện tại và đặt nó theo yêu cầu của bạn. Giả tham chiếu chứa TestSheet!$A$1:$B$8 và bạn muốn thay đổi nó để MySheet!$B$5:$C$12

Đối với bất kỳ tế bào, nói "B5", lúc chạy,

cell.getReference(); 

sẽ cung cấp cho bạn tham chiếu ô (như trong ví dụ ... nó sẽ trả lại cho bạn "B5")

char startCellColRef = cell.getReference().toString().charAt(0); 

sẽ cung cấp cho bạn tham chiếu cột (sẽ cung cấp cho bạn "B" nếu ô hiện tại là B5). Bây giờ

int startCellRowRef = cell.getReference().toString().charAt(1); 

sẽ cung cấp cho bạn chỉ mục hàng (sẽ cung cấp cho bạn "5" nếu ô hiện tại là B5).

Cũng giống như cách bạn có thể nhận được các tham chiếu ô bắt đầu và kết thúc của bạn (nói B5 và C12).

Bây giờ, tôi có thể cập nhật các tham chiếu hiện tại như thế nào. Chỉ cần cập nhật giá trị của nó bằng chuỗi tham chiếu mới được tạo

Name reference = wb.getName("NameReferenceInExcelSheet"); 
referenceString = sheetName+"!$"+startCellColRef+"$"+startCellRowRef+":$"+endCellColRef+"$"+endCellRowRef; 
reference.setRefersToFormula(referenceString);