158 lines
5.5 KiB
Java
158 lines
5.5 KiB
Java
/* ====================================================================
|
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
|
contributor license agreements. See the NOTICE file distributed with
|
|
this work for additional information regarding copyright ownership.
|
|
The ASF licenses this file to You under the Apache License, Version 2.0
|
|
(the "License"); you may not use this file except in compliance with
|
|
the License. You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
==================================================================== */
|
|
package org.apache.poi.ss.util;
|
|
|
|
import java.util.Calendar;
|
|
import java.util.Date;
|
|
|
|
import org.apache.poi.ss.usermodel.Sheet;
|
|
import org.apache.poi.ss.usermodel.Workbook;
|
|
import org.apache.poi.ss.usermodel.Row;
|
|
import org.apache.poi.ss.usermodel.Cell;
|
|
|
|
/**
|
|
* Class {@code SheetBuilder} provides an easy way of building workbook sheets
|
|
* from 2D array of Objects. It can be used in test cases to improve code
|
|
* readability or in Swing applications with tables.
|
|
*
|
|
* @author Roman Kashitsyn
|
|
*/
|
|
public class SheetBuilder {
|
|
|
|
private final Workbook workbook;
|
|
private final Object[][] cells;
|
|
private boolean shouldCreateEmptyCells = false;
|
|
private String sheetName = null;
|
|
|
|
public SheetBuilder(Workbook workbook, Object[][] cells) {
|
|
this.workbook = workbook;
|
|
this.cells = cells.clone();
|
|
}
|
|
|
|
/**
|
|
* Returns {@code true} if null array elements should be treated as empty
|
|
* cells.
|
|
*
|
|
* @return {@code true} if null objects should be treated as empty cells
|
|
* and {@code false} otherwise
|
|
*/
|
|
public boolean getCreateEmptyCells() {
|
|
return shouldCreateEmptyCells;
|
|
}
|
|
|
|
/**
|
|
* Specifies if null array elements should be treated as empty cells.
|
|
*
|
|
* @param shouldCreateEmptyCells {@code true} if null array elements should be
|
|
* treated as empty cells
|
|
* @return {@code this}
|
|
*/
|
|
public SheetBuilder setCreateEmptyCells(boolean shouldCreateEmptyCells) {
|
|
this.shouldCreateEmptyCells = shouldCreateEmptyCells;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Specifies name of the sheet to build. If not specified, default name (provided by
|
|
* workbook) will be used instead.
|
|
* @param sheetName sheet name to use
|
|
* @return {@code this}
|
|
*/
|
|
public SheetBuilder setSheetName(String sheetName) {
|
|
this.sheetName = sheetName;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Builds sheet from parent workbook and 2D array with cell
|
|
* values. Creates rows anyway (even if row contains only null
|
|
* cells), creates cells if either corresponding array value is not
|
|
* null or createEmptyCells property is true.
|
|
* The conversion is performed in the following way:
|
|
* <p/>
|
|
* <ul>
|
|
* <li>Numbers become numeric cells.</li>
|
|
* <li><code>java.util.Date</code> or <code>java.util.Calendar</code>
|
|
* instances become date cells.</li>
|
|
* <li>String with leading '=' char become formulas (leading '='
|
|
* will be truncated).</li>
|
|
* <li>Other objects become strings via <code>Object.toString()</code>
|
|
* method call.</li>
|
|
* </ul>
|
|
*
|
|
* @return newly created sheet
|
|
*/
|
|
public Sheet build() {
|
|
Sheet sheet = (sheetName == null) ? workbook.createSheet() : workbook.createSheet(sheetName);
|
|
Row currentRow = null;
|
|
Cell currentCell = null;
|
|
|
|
for (int rowIndex = 0; rowIndex < cells.length; ++rowIndex) {
|
|
Object[] rowArray = cells[rowIndex];
|
|
currentRow = sheet.createRow(rowIndex);
|
|
|
|
for (int cellIndex = 0; cellIndex < rowArray.length; ++cellIndex) {
|
|
Object cellValue = rowArray[cellIndex];
|
|
if (cellValue != null || shouldCreateEmptyCells) {
|
|
currentCell = currentRow.createCell(cellIndex);
|
|
setCellValue(currentCell, cellValue);
|
|
}
|
|
}
|
|
}
|
|
return sheet;
|
|
}
|
|
|
|
/**
|
|
* Sets the cell value using object type information.
|
|
*
|
|
* @param cell cell to change
|
|
* @param value value to set
|
|
*/
|
|
private void setCellValue(Cell cell, Object value) {
|
|
if (value == null || cell == null) {
|
|
return;
|
|
} else if (value instanceof Number) {
|
|
double doubleValue = ((Number) value).doubleValue();
|
|
cell.setCellValue(doubleValue);
|
|
} else if (value instanceof Date) {
|
|
cell.setCellValue((Date) value);
|
|
} else if (value instanceof Calendar) {
|
|
cell.setCellValue((Calendar) value);
|
|
} else if (isFormulaDefinition(value)) {
|
|
cell.setCellFormula(getFormula(value));
|
|
} else {
|
|
cell.setCellValue(value.toString());
|
|
}
|
|
}
|
|
|
|
private boolean isFormulaDefinition(Object obj) {
|
|
if (obj instanceof String) {
|
|
String str = (String) obj;
|
|
if (str.length() < 2) {
|
|
return false;
|
|
} else {
|
|
return ((String) obj).charAt(0) == '=';
|
|
}
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
private String getFormula(Object obj) {
|
|
return ((String) obj).substring(1);
|
|
}
|
|
} |