2016-01-24 2 views
1

Я стараюсь, чтобы лист XLSX находился в верхнем левом углу, когда файл открыт.Установить верхнюю строку и левый столбец для XSSFSheet

У XSSFSheet есть методы getTopCol() и getLeftCol(), но нет сеттера.

XSSFSheet.showInPane(int, int) действительно работает, но только если панель заморожена или разделена.

PaneInformation pane = sheet.getPaneInformation(); 
    if (pane == null) { 
     // FIXME doesn't work when there is no pane 
     sheet.showInPane(CellAddress.A1.getRow(), CellAddress.A1.getColumn()); 
    } else { 
     // OK 
     sheet.showInPane(pane.getHorizontalSplitPosition(), pane.getVerticalSplitPosition()); 
    } 

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

Кто-нибудь знает способ сброса вида листа в верхнюю левую ячейку?

ответ

1

Кажется, что нет такой настройки непосредственно с объектами POI. Но это возможно с CTWorksheet. http://grepcode.com/file/repo1.maven.org/maven2/org.apache.poi/ooxml-schemas/1.1/org/openxmlformats/schemas/spreadsheetml/x2006/main/CTWorksheet.java#CTWorksheet

... 
((XSSFSheet)sheet).getCTWorksheet().getSheetViews().getSheetViewArray(0).setTopLeftCell("D10"); 
... 

лучшая возможность получать такие сведения создает простой файл непосредственно с Excel. Затем сохраните это как *.xlsx. Затем распакуйте этот файл и посмотрите в /xl/worksheets/sheet1.xml. Там вы найдете:

... 
<sheetViews> 
<sheetView workbookViewId="0" tabSelected="true" topLeftCell="D10"/> 
</sheetViews> 
... 
+0

Извините за задержку.Итак, если я резюмирую здесь, ваше предложение состояло бы в том, чтобы самостоятельно отредактировать XML-файлы? Слишком плохо для меня: я выбрал POI в надежде избежать этого. :) – Chop

+0

@Chop: Нет, я предоставил строку кода, которая устанавливает 'TopLeftCell' для' XSSFSheet'. Мое предложение взглянуть на «XML» должно показать вам, как вы можете получить информацию о том, что возможно. –

+0

Я даже не знаю, почему я пропустил это. Я нашел этот метод, исследуя источники, но был убежден, что это «частный». Благодаря! (Это одно из таких случаев, когда я чувствую себя нелепо). – Chop

0

Чтобы добавить еще немного фона на этом:

Если посмотреть на соответствующих реализациях getTopRow() и getLeftCol() они оба получают свои значения из экземпляра CTSheetView (через две разных способы, которые, я полагаю, не являются полностью преднамеренными).

Напротив, showInPane() основан на CTPane, который представляет собой структуру данных, которая живет на одном уровне ниже CTSheetView. Согласно ECMA-376 (страница 3904) такой CTPane является необязательным (т. Е. Вам не нужно применять «разделение» к вашему CTSheetView).

Однако мне остается сомневаться в следующем: showInPane() (через getPane()) действительно пытается создать новую панель, если ее еще нет. На этой новой панели он вызывает setTopLeftCell() - который согласно ECMA-376 (стр. 1657) применяется только к нижней правой панели . Тип новой по умолчанию новой панели: в верхнем левом углу (см. Страницу 2460 этой спецификации для списка доступных панелей).

Это означает:

  • Там может быть ошибка в этом чудовищном ECMA-376 спецификации. Поэтому установка верхней левой ячейки действительно возможна для всех типов панелей.
  • POI, вероятно, содержит ошибку где-то около getPane() -метод, который препятствует фактической вставке новой панели в представление листа.

... для прагматичного решения, как обойти это, вы должны придерживаться ответа Акселя Рихтера. Это устанавливает видимые ячейки непосредственно на CTSheetView, что наиболее вероятно, что вы после.