Java Apache POI (стили текста/свойства ячеек)

421
03 августа 2017, 23:40

Есть небольшой код на экспорт данных с Jtable в excel

public class ExcelOrders {
    private static String getCellValue(JTable table, int x, int y) {
        return table.getValueAt(x, y).toString();
    }
    public static void writeToExcel (JTable table, String folder) {
        XSSFWorkbook wb = new XSSFWorkbook();
        XSSFSheet ws = wb.createSheet();
        TreeMap<String, Object[]> data = new TreeMap<>();
        data.put("-1", new Object[]{table.getColumnName(0), table.getColumnName(1), table.getColumnName(2),
            table.getColumnName(3), table.getColumnName(4), table.getColumnName(6), table.getColumnName(8),
            table.getColumnName(9)});
        for (int i = 0; i < table.getRowCount(); i++) {
            data.put(Integer.toString(i), new Object[] {getCellValue(table, i, 0), getCellValue(table, i, 1),
                getCellValue(table, i, 2), getCellValue(table, i, 3), getCellValue(table, i, 4),
                getCellValue(table, i, 6), getCellValue(table, i, 8), getCellValue(table, i, 9)});
        }     
        Set<String> ids = data.keySet();
        XSSFRow row;
        int rowId = 0;
        for (String key: ids) {
            row = ws.createRow(rowId++);            
            Object[] values = data.get(key);
            int celId=0;
            for (Object o: values) {
                Cell cell = row.createCell(celId++);
                cell.setCellValue(o.toString());
                cell.setCellStyle(styleExcel.createHeadingStyle(wb));
            }
        }
        try {
            FileOutputStream fos = new FileOutputStream(new File(folder+"\\"+"Список рабочих.xlsx"));
            wb.write(fos);
            fos.close();
        } catch (Exception Ex) {
            Logger.getLogger(ExcelOrders.class.getName()).log(Level.SEVERE, null, Ex);
            new errorDialog(null, new StringEntered(Ex.getMessage()).getStringEntered(100),
            new StringEntered().toString(Ex.getStackTrace()), "Программная ошибка", JOptionPane.ERROR_MESSAGE);
        }
    }
}

Хочу применить свойства жирности и растягивание по содержимому ячейки к первой строке

Написан небольшой метод

public static CellStyle createHeadingStyle(XSSFWorkbook book) {
        XSSFCellStyle style = book.createCellStyle();
        XSSFFont fontHeader = book.createFont();
        fontHeader.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        style.setFont(fontHeader);
        return style;
    }

В данном методе шрифт становится жирным во всех ячейках Как мне допилить его чтобы свойство bold применялось к 1 строке и также расширялось по содержимому в ячейки

Расширение сделал. Как установить жирный шрифт только 1 строке?

Answer 1

Нет необходимости создавать новый стиль для каждой ячейки - создайте предварительно 2 стиля: для 1й строки и для всех остальных, и затем используйте их. Код для стилей:

public static CellStyle createBaseStyle(XSSFWorkbook book) {
    XSSFCellStyle style = book.createCellStyle();
    //необходимые настройки
    return style;
}
public static CellStyle createHeadingStyle(XSSFWorkbook book) {
    XSSFCellStyle style = book.createCellStyle();
    XSSFFont fontHeader = book.createFont();
    fontHeader.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
    style.setFont(fontHeader);
    return style;
}

И измененный вариант заполнения таблицы:

Set<String> ids = data.keySet();
    XSSFRow row;
    CellStyle baseStyle = styleExcel.createBaseStyle(wb);
    CellStyle headingStyle = styleExcel.createHeadingStyle(wb);
    int rowId = 0;
    for (String key : ids) {
        row = ws.createRow(rowId);
        Object[] values = data.get(key);
        int celId = 0;
        for (Object o : values) {
            Cell cell = row.createCell(celId++);
            cell.setCellValue(o.toString());
            cell.setCellStyle(rowId == 0 ? headingStyle: baseStyle);
        }
        rowId++;
    }

UPD для проверки типов значений

for (Object o : values) {
        Cell cell = row.createCell(celId++);
        if (o instanceof Double) {
            cell.setCellValue((Double)o);
        } else if (o instanceof Integer) {
            cell.setCellValue((Integer)o);
        }
        // else if прочие типы - decimal и т.д.
        else {
            cell.setCellValue(o.toString());
        }
        cell.setCellStyle(rowId == 0 ? headingStyle: baseStyle);
    }
READ ALSO
Собрать HashMap в JSP

Собрать HashMap в JSP

Дано: Создается система прохождения различных тестов , для обработки данных было выбрано решение собирать в jsp HashMap состоящий из ключа (ID ответа)...

386
JAVA Декомпиляция

JAVA Декомпиляция

Допустим есть программа написанная на java Затем пропущена через врапер, получен exe файлНа сколько просто декомпилировать такую программу,...

229
почему получается -1 при сужающем приведении примитивных типов, а ещё почему не вылетает ArifmeticException

почему получается -1 при сужающем приведении примитивных типов, а ещё почему не вылетает ArifmeticException

ArifmeticException не вылетает потому что делимое - вещественный, а не целочисленный тип (был бы int, long и тд

228
unknown error: Chrome failed to start: exited abnormally ChromeDriver Selenium Java

unknown error: Chrome failed to start: exited abnormally ChromeDriver Selenium Java

Пытаюсь запустить ChromeDriver на Ubuntu 1604

300