2013-07-10 6 views
4

Я искал какое-то время и еще не смог найти решение.Apache POI, вызывающий автосохранение после автоматического фильтра

Этот вопрос был задан раньше, но OP не получил ответа, и я не хотел воскрешать старую нить, поэтому решил задать новый вопрос. Поток OP равен here.

Проблема, с которой я столкнулась, заключается в том, что у меня есть электронная таблица, которая создается с данными, полученными из базы данных, однако иногда данные в ячейках могут быть довольно длинными, поэтому требуется, чтобы POI автоматически сортировал, чтобы сохранить пользователя, сделайте это, но поскольку я устанавливаю автофильтр перед вызовом autosize, он не совсем работает.

Я использую Apache POI 3.9.

Я либо добираюсь до точки, где он авторизован, но не учитывает стрелку раскрывающегося списка автофильтра, или я получаю исключение с помощью исключающего указателя.

Я пробовал перемещать цикл for по всему месту, в том числе в конце, где данные записываются в электронную таблицу, а также непосредственно перед потоком вывода файла, но безрезультатно.

Я также пробовал использовать несколько разных шрифтов, но это тоже не сработало.

Надеясь, что кто-то может мне помочь.

Благодаря

ответ

3

По моему разумению, выбранный текст фильтра выпадающего меню скрывается из-за стрелки. Если я прав, почему бы вам просто не дать отступы после авторазбора! Я имею в виду первого Autosize седловины по:

testSheet.autoSizeColumn(ColIndex); 

затем рассчитать ширину столбца и добавить нужные отступы в ширине

testSheet.setColumnWidth(ColIndex ,testSheet.getColumnWidth(ColIndex)+PaddingWidth); 

это даст достаточное заполнение для значка со стрелкой вправо, чтобы выпадающее меню и текст будет полно.

10

Я тот, кто написал оригинальную тему, которую вы указали. В конце я достиг решения, а не того, что искал, но, по крайней мере, он работает для меня. Я просто забыл обновить свой вопрос с помощью найденного решения.

Я создал новый метод, который выполняет итерации над столбцами листа, которые я хочу авторизовать и делать две вещи. Сначала я автоматически сортирую столбец, поэтому мы не будем иметь ширину, которую мы не хотим, потому что она не учитывает ширину стрелки. Затем я устанавливаю ширину столбца вручную, включая ширину стрелки. Мне пришлось немного поиграть, чтобы найти ширину стрелки (для меня это 1300). Я предполагаю, что эта ширина может работать для вас, но вы можете установить ее так, как хотите.

Как вы можете себе представить, вы должны сначала получить и автофильтр данных. После этого вы вызываете метод Autosize столбцов, как один я использовал:

private static final int WIDTH_ARROW_BUTTON = 1300; 

private void autosizeColumnsFromSheet(final Sheet excelSheet, final int fromColumn, final int toColumn) { 
     for (int i = fromColumn; i <= toColumn; i++) { 
      excelSheet.autoSizeColumn(new Short(String.valueOf(i))); 
      try { 
       excelSheet.setColumnWidth(i, excelSheet.getColumnWidth(i) + WIDTH_ARROW_BUTTON); 
      } catch (final Exception e) { 
       // don't do anything - just let autosize handle it 
      } 
     } 
    } 
1
  int WIDTH_ARROW_BUTTON = 2 * 255; 
     for (int i = 0; i < row.getLastCellNum(); i++) { 
      sheet.autoSizeColumn(i); 
      // For filter additional arrow width 
      sheet.setColumnWidth(i, sheet.getColumnWidth(i) + WIDTH_ARROW_BUTTON); 
     }