2017-12-27 30 views
-3

私はすべての列にフィルタを追加したExcelシートを持っています。私はapache POI JAVAを使用していくつかのフィルタの値を設定解除/設定したい。私は無駄に多くのことを試みました。どんな助けもありがとう。JAVAのapache POIを使用してExcelで列フィルタの値を設定/設定解除する方法は?

Unset few values in the following filter
Data Sheet

+1

コードを投稿する必要があります。 –

+0

もし私がそれについて考えていたら、私はやっただろう。私はExcelファイルを読み書きすることはできますが。私が投稿できる関連コードはありませんでした。 –

答えて

1

今これが唯一のapache poiの下層低レベルのオブジェクトを使用して達成することができるまで。 AutoFilterについては、 org.openxmlformats.schemas.spreadsheetml.x2006.main.CTAutoFilterと後継者です。

例:Frequently Asked Questionsで述べたように

import org.apache.poi.ss.usermodel.*; 
import org.apache.poi.ss.util.*; 
import org.apache.poi.xssf.usermodel.*; 

import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTAutoFilter; 
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTFilterColumn; 
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTFilters; 
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCustomFilters; 
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCustomFilter; 
import org.openxmlformats.schemas.spreadsheetml.x2006.main.STFilterOperator; 

import java.io.FileOutputStream; 

class AutoFilterSetTest { 

private static void setCellData(Sheet sheet) { 
    Row row = sheet.createRow(0); 
    Cell cell = row.createCell(0); 
    cell.setCellValue("Number"); 
    cell = row.createCell(1); 
    cell.setCellValue("Alphabets"); 

    for (int r = 1; r < 11; r++) { 
    row = sheet.createRow(r); 
    cell = row.createCell(0); 
    cell.setCellValue(r); 
    cell = row.createCell(1); 
    cell.setCellValue(new String(Character.toChars(64 + r))); 
    } 
} 

private static void setCriteriaFilter(XSSFSheet sheet, int colId, int firstRow, int lastRow, String[] criteria) throws Exception { 
    CTAutoFilter ctAutoFilter = sheet.getCTWorksheet().getAutoFilter(); 
    CTFilterColumn ctFilterColumn = ctAutoFilter.addNewFilterColumn(); 
    ctFilterColumn.setColId(colId); 
    CTFilters ctFilters = ctFilterColumn.addNewFilters(); 

    for (int i = 0; i < criteria.length; i++) { 
    ctFilters.addNewFilter().setVal(criteria[i]); 
    } 

    //hiding the rows not matching the criterias 
    DataFormatter dataformatter = new DataFormatter(); 
    for (int r = firstRow; r <= lastRow; r++) { 
    XSSFRow row = sheet.getRow(r); 
    boolean hidden = true; 
    for (int i = 0; i < criteria.length; i++) { 
    String cellValue = dataformatter.formatCellValue(row.getCell(colId)); 
    if (criteria[i].equals(cellValue)) hidden = false; 
    } 
    if (hidden) row.getCTRow().setHidden(hidden); 
    } 
} 

public static void main(String[] args) throws Exception { 

    XSSFWorkbook wb = new XSSFWorkbook(); 
    XSSFSheet sheet = wb.createSheet(); 

    //create rows of data 
    setCellData(sheet); 

    for (int c = 0; c < 2; c++) sheet.autoSizeColumn(c); 

    int lastRow = sheet.getLastRowNum(); 
    XSSFAutoFilter autofilter = sheet.setAutoFilter(new CellRangeAddress(0, lastRow, 0, 1)); 
    //XSSFAutoFilter is useless until now 

    setCriteriaFilter(sheet, 0, 1, lastRow, new String[]{"2", "4", "7"}); 

    wb.write(new FileOutputStream("AutoFilterSetTest.xlsx")); 
    wb.close(); 
} 
} 

このコードは、スキーマooxml-schemas-1.3.jarのすべての完全なjarファイルを必要とします。これは、低レベルのorg.openxmlformats.schemas.spreadsheetml.x2006.main.CT*Filter*クラスは、デフォルトでapache poiと一緒に出荷される小さいに含まれていないためです。

+0

ありがとう!それは正常に動作しますが、それは最新のpoiバージョンでのみ利用可能ですが、私は推測します。 –

+0

@Parthenophobic Sallu:いいえ。このコードでは、[Frequently Asked Questions](https://poi.apache.org/faq.html#)で説明したように、すべてのスキーマooxml-schemas-1.3.jarの完全なjarが必要です。 faq-N10025)。 –

+0

ありがとうございます。完璧に動作します。また、なぜ低レベルのオブジェクトを使用するのが良い方法ではないのかを知りたかったのですが? –

関連する問題