Автоматический фильтр POI

Как использовать POI Apache для предварительного определения области автофильтра в документе Excel 2007?

Маленький пример кода или ссылка были бы приятными.

Сохраните первую и последнюю ячейки из области фильтра и выполните:

sheet.setAutoFilter(new CellRangeAddress(firstCell.getRow(), lastCell.getRow(), firstCell.getCol(), lastCell.getCol())); 

Например, из листа ниже.

 >x (x, y) 0123456 0|--hhh--| h = header 1|--+++--| + = values 2|--+++--| - = empty fields 3|--+++--| 4|-------| 

Первая ячейка будет заголовком над первой + (2,1) ячейкой. Последней будет последняя + ячейка (5,3)

 //include poi-3.7.jar,ojdbc.jar in classpath import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.Statement; import java.io.*; import java.net.*; import javax.servlet.*; import javax.servlet.http.*; import org.apache.poi.hssf.usermodel.*; import org.apache.poi.hssf.util.HSSFColor; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.IndexedColors; public class ExcelCreator{ public static void createExcel(String anySql,OutputStream out) throws Exception{ Connection conn=getOracleConnection(); String userSql1="select * from tab"; String userSql2="select * from tab"; String[] sqls={userSql1,userSql2,anySql}; String[] workSheetNames={"User","Manager","Any"}; HSSFWorkbook wb = new HSSFWorkbook(); CellStyle style1 = wb.createCellStyle(); CellStyle style2 = wb.createCellStyle(); for(int i=0;i<lt;sqls.length;i++){ if(sqls[i]==null||sqls[i].length()==0){ continue; } HSSFSheet sheet = wb.createSheet(workSheetNames[i]); Statement st = conn.createStatement(); System.out.println("--------------------------"); System.out.println(sqls[i]); ResultSet rs = st.executeQuery(sqls[i]); ResultSetMetaData rsMetaData = rs.getMetaData(); int numberOfColumns = rsMetaData.getColumnCount(); int rowCounter=0; HSSFRow rowHeader = sheet.createRow(rowCounter); for(int columnCounter=0; columnCounter<lt;numberOfColumns;columnCounter++){ rowHeader.createCell(columnCounter).setCellValue(rsMetaData.getColumnName(columnCounter+1)); setFilledColorStyle(rowHeader.getCell(columnCounter),style2); } sheet.setAutoFilter(org.apache.poi.ss.util.CellRangeAddress.valueOf("A1:"+ (Character.toString((char)( 65+numberOfColumns-1)))+"1")); rowCounter++; while(rs.next()) { // Create a row and put some cells in it. Rows are 0 based. HSSFRow row = sheet.createRow(rowCounter); for(int columnCounter=0; columnCounter<lt;numberOfColumns;columnCounter++){ row.createCell(columnCounter).setCellValue(rs.getString(columnCounter+1)); setThinBorderStyle(row.getCell(columnCounter),style1); } rowCounter++; } rs.close(); st.close(); } // Write the output wb.write(out); out.close(); conn.close(); System.out.println("Created Successfully"); } public static void main(String[] args) throws Exception{ OutputStream out = new FileOutputStream("c:/admin.xls"); createExcel(" select * from tab", out); } public static Connection getOracleConnection() throws Exception { String driver = "oracle.jdbc.driver.OracleDriver"; String url = "jdbc:oracle:thin:@localhost:XE"; String username = "system"; String password = "password"; Class.forName(driver); // load Oracle driver Connection conn = DriverManager.getConnection(url, username, password); return conn; } //This method set the thin border style private static void setThinBorderStyle(Cell cell, CellStyle style) { style.setBorderBottom(CellStyle.BORDER_THIN); style.setBottomBorderColor(IndexedColors.RED.getIndex()); style.setBorderLeft(CellStyle.BORDER_THIN); style.setLeftBorderColor(IndexedColors.RED.getIndex()); style.setBorderRight(CellStyle.BORDER_THIN); style.setRightBorderColor(IndexedColors.RED.getIndex()); style.setBorderTop(CellStyle.BORDER_THIN); style.setTopBorderColor(IndexedColors.RED.getIndex()); cell.setCellStyle(style); } //This method set the dashed border style private static void setDashedBorderStyle(Cell cell, CellStyle style) { style.setBorderBottom(CellStyle.BORDER_DASHED); style.setBottomBorderColor(IndexedColors.GREEN.getIndex()); style.setBorderLeft(CellStyle.BORDER_DASHED); style.setLeftBorderColor(IndexedColors.GREEN.getIndex()); style.setBorderRight(CellStyle.BORDER_DASHED); style.setRightBorderColor(IndexedColors.GREEN.getIndex()); style.setBorderTop(CellStyle.BORDER_DASHED); style.setTopBorderColor(IndexedColors.GREEN.getIndex()); cell.setCellStyle(style); } // This method set the dotted border style private static void setFilledColorStyle(Cell cell, CellStyle style) { // style.setFillBackgroundColor(new HSSFColor.YELLOW().getIndex()); style.setFillForegroundColor(IndexedColors.ORANGE.getIndex()); style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND ); // style.setBorderLeft(CellStyle.BORDER_DOTTED); // style.setLeftBorderColor(IndexedColors.BLUE.getIndex()); // style.setBorderRight(CellStyle.BORDER_DOTTED); // style.setRightBorderColor(IndexedColors.BLUE.getIndex()); // style.setBorderTop(CellStyle.BORDER_DOTTED); // style.setTopBorderColor(IndexedColors.BLUE.getIndex()); cell.setCellStyle(style); } } 
  sets Auto filter sheet.setAutoFilter(CellRangeAddress.valueOf("A1:N1")); 

Мне было трудно получить CellRange, поскольку мои столбцы и значения строк были переменными. Поэтому я использовал этот трюк.

Инициализировать переменную lastCellReference для A1, которая является ячейкой row1, column1

 String lastCellReference = "A1"; 

Каждый раз, когда вы создаете обновление ячейки, lastCellReference поддерживает самую последнюю ценность

 cell = row.createCell((short) columnCount); cell.setCellValue(rs.getInt(i)); lastCellReference=cell.getReference(); 

A1 всегда будет первой ячейкой, а затем lastCellReference

  sheet1.setAutoFilter(CellRangeAddress.valueOf("A1:"+ lastCellReference)); 

Эта функциональность становится доступной, поскольку версия apache APA 3.7-beta3-20100811

Ответ: Это пока невозможно.

https://issues.apache.org/bugzilla/show_bug.cgi?id=35125

  • «Метод AutoFilter Method Range Range failed» при смене с Form Control на ActiveX
  • Есть ли способ увидеть, какие фильтры активны в Excel, кроме значков воронки?
  • Autofilter a Range, исключая две даты
  • Фильтр Microsoft Excel Spreadsheet с ячейками с несколькими значениями
  • Макрос Excel для включения параметра в диапазон
  • Как создать Excel с функцией Autofilter от ObservableCollection в C #
  • VBA AutoFilter несколько листов, основанных на массиве чисел, игнорировать, если нет в списке
  • Изменить Loop to Auto Filter для упрощения MACRO
  • не может использовать автофильтр, чтобы показывать даты до 2014 года. excel c #
  • Есть ли библиотека Java-Excel, которая поддерживает AutoFilter в Excel?
  • Как фильтровать строки в excel на основе этих критериев
  • Interesting Posts

    Обновление выбранных данных доступа для улучшения в соответствующих местах

    Функция Excel VBA vlookup с ошибкой времени выполнения

    конвертировать кросс-таблицу в список для создания сводной таблицы

    Сумма между диапазоном дат из двух разных листов

    Auto Fit Column Width для заголовков, которые позволяют пространство для фильтра Drop Down Arrow

    Формула или макрос для группировки клеток в соответствии с их значениями

    Экспорт из Excel в AccessDB, ошибки Аргументы имеют неправильный тип, находятся вне допустимого диапазона или находятся в конфликте друг с другом

    Как я могу условно VLOOKUP в Excel?

    excel 2010: как преобразовать 2d координатных столбцов в 2d координаты для строки

    Ссылка на Excel Userform Control Имя Значение из строки (VBA)

    Excel VBA для установки переменной в рабочий лист

    Транспонирование столбцов

    Как создать функцию Excel VBA, которая работает при повторном открытии документа?

    Отключить ячейки на другом листе

    Android открыть файл и позволить пользователю выбрать, какая программа может его открыть

    Давайте будем гением компьютера.