0

我是新手,只是玩弄 apache-poi 来生成一个带有一些模拟数据的 excel 表,这是我的课,我对一些事情感到震惊,有什么最佳实践吗?在此处输入图像描述

  1. 自动设置行中合并单元格的大小。
  2. 字体粗体-> 对于第一行中的所有单元格。

班级:

package com.example.TestProject.process;

import java.io.File;
import java.io.FileOutputStream;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;


public class WriteExcelDemo {

    public static void main(
            String[] args) {

        // Blank workbook
        XSSFWorkbook workbook = new XSSFWorkbook();

        // Create a blank sheet
        XSSFSheet sheet = workbook.createSheet("Employee Data");

        // This data needs to be written (Object[])
        Map<String, Object[]> data = new TreeMap<String, Object[]>();
        data.put("1", new Object[] {"ID", "NAME", "LASTNAME"});
        data.put("2", new Object[] {1, "Amit", "Shukla"});
        data.put("3", new Object[] {2, "Lokesh", "Gupta"});
        data.put("4", new Object[] {3, "John", "Adwards"});
        data.put("5", new Object[] {4, "Brian", "Schultz"});

        // Iterate over data and write to sheet
        Set<String> keyset = data.keySet();
        int rownum = 0;
        for (String key : keyset) {
            Row row = sheet.createRow(rownum++);
            Object[] objArr = data.get(key);
            int cellnum = 0;
            for (Object obj : objArr) {
                Cell cell = row.createCell(cellnum++);
                if (obj instanceof String)
                    cell.setCellValue((String) obj);
                else if (obj instanceof Integer)
                    cell.setCellValue((Integer) obj);
            }
        }
        try {
            // Write the workbook in file system
            FileOutputStream out = new FileOutputStream(new File("howtodoinjava_demo.xlsx"));
            workbook.write(out);
            out.close();

            System.out.println("howtodoinjava_demo.xlsx written successfully on disk.");

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

4

1 回答 1

2

对于自动调整列大小,有Sheet.autoSizeColumn。您可以在此处指定是否应考虑或忽略合并单元格的内容。默认是忽略合并的单元格。但是您的问题在这一点上并不是很清楚,因为您的代码根本没有合并单元格。

对于行样式,有Row.setRowStyleExcel当新单元格添加到该行时采用该样式。但apache poi不这样做。它始终对新创建的单元格使用默认单元格样式。所以我们需要一种方法CellStyle getPreferredCellStyle(Cell cell)来获取给定单元格的首选单元格样式Excel

而且,由于您在询问最佳实践,请org.apache.poi.ss.usermodel.*尽可能长时间地使用。所以代码能够处理HSSF并且XSSF没有太多变化。

例子:

import java.io.File;
import java.io.FileOutputStream;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.usermodel.HSSFCell;

public class WriteExcelDemo {

 static CellStyle getPreferredCellStyle(Cell cell) {
  // a method to get the preferred cell style for a cell
  // this is either the already applied cell style
  // or if that not present, then the row style (default cell style for this row)
  // or if that not present, then the column style (default cell style for this column)
  CellStyle cellStyle = cell.getCellStyle();
  // if no explicit cell style applied then cellStyle.getIndex() is 0 for XSSF
  // or 15 (0xF = the index to the default ExtendedFormatRecord (0xF)) for HSSF
  if ((cell instanceof XSSFCell && cellStyle.getIndex() == 0) || (cell instanceof HSSFCell && cellStyle.getIndex() == 15)) cellStyle = cell.getRow().getRowStyle();
  if (cellStyle == null) cellStyle = cell.getSheet().getColumnStyle(cell.getColumnIndex());
  if (cellStyle == null) cellStyle = cell.getCellStyle();
  return cellStyle;
 }

 public static void main(String[] args) throws Exception {

  // Blank workbook XSSF or HSSF
  Workbook workbook = new XSSFWorkbook();
  //Workbook workbook = new HSSFWorkbook();

  // Create needed cell styles on workbook level
  Font boldFont = workbook.createFont();
  boldFont.setBold(true);
  CellStyle headerRowStyle = workbook.createCellStyle();
  headerRowStyle.setFont(boldFont);


  // This data needs to be written (Object[])
  Map<String, Object[]> data = new TreeMap<String, Object[]>();
  data.put("1", new Object[] {"ID", "NAME", "LASTNAME"});
  data.put("2", new Object[] {1, "Amit", "Shukla"});
  data.put("3", new Object[] {2, "Lokesh", "Gupta"});
  data.put("4", new Object[] {3, "John", "Adwards"});
  data.put("5", new Object[] {4, "Brian", "Schultz"});

  // Create a blank sheet
  Sheet sheet = workbook.createSheet("Employee Data");

  // Iterate over data and write to sheet
  Set<String> keyset = data.keySet();
  int rownum = 0;
  for (String key : keyset) {
   Row row = sheet.createRow(rownum++);
   if (rownum == 1) row.setRowStyle(headerRowStyle); // row style for first row; Excel takes that style when new cells are added to this row
   Object[] objArr = data.get(key);
   int cellnum = 0;
   for (Object obj : objArr) {
    Cell cell = row.createCell(cellnum++);
    cell.setCellStyle(getPreferredCellStyle(cell)); // set the preferred cell style for the new cell as Excel would do
    if (obj instanceof String)
     cell.setCellValue((String) obj);
    else if (obj instanceof Integer)
     cell.setCellValue((Integer) obj);
   }
  }

  for (int c = 0; c < data.get("1").length; c++) {
   //sheet.autoSizeColumn(c); // autosize, merged cells should be ignored
   sheet.autoSizeColumn(c, true); // autosize, merged cells should be considered
  }

  // Write the workbook in file system
  String filepath = (workbook instanceof XSSFWorkbook)?"./howtodoinjava_demo.xlsx":"./howtodoinjava_demo.xls";
  FileOutputStream out = new FileOutputStream(new File(filepath));
  workbook.write(out);
  out.close();
  workbook.close();

  System.out.println("howtodoinjava_demo.xlsx written successfully on disk.");
 }
}
于 2019-10-24T06:38:28.010 回答