Java ApachePOI:使用合并单元格自动设置大小并使字体粗体
我是新手,只是在使用ApachePOI生成一个包含一些模拟数据的excel工作表,这是我的课程,我对一些事情感到震惊,有什么最佳实践吗Java ApachePOI:使用合并单元格自动设置大小并使字体粗体,java,excel,apache-poi,apache-poi-4,Java,Excel,Apache Poi,Apache Poi 4,我是新手,只是在使用ApachePOI生成一个包含一些模拟数据的excel工作表,这是我的课程,我对一些事情感到震惊,有什么最佳实践吗 自动设置行中合并单元格的大小 字体粗体-->用于第一行中的所有单元格 类别: package com.example.TestProject.process; import java.io.File; import java.io.FileOutputStream; import java.util.Map; import java.util.Set; imp
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();
}
}
package com.example.TestProject.process;
导入java.io.File;
导入java.io.FileOutputStream;
导入java.util.Map;
导入java.util.Set;
导入java.util.TreeMap;
导入org.apache.poi.ss.usermodel.Cell;
导入org.apache.poi.ss.usermodel.Row;
导入org.apache.poi.xssf.usermodel.xssfheet;
导入org.apache.poi.xssf.usermodel.xssf工作簿;
公共类WriteExcelDemo{
公共静态真空总管(
字符串[]args){
//空白工作簿
XSSFWorkbook工作簿=新XSSFWorkbook();
//创建空白工作表
XSSFSheet sheet=workbook.createSheet(“员工数据”);
//需要写入此数据(对象[])
映射数据=新树映射();
data.put(“1”,新对象[]{“ID”,“NAME”,“LASTNAME”});
data.put(“2”,新对象[]{1,“Amit”,“Shukla”});
data.put(“3”,新对象[]{2,“Lokesh”,“Gupta”});
data.put(“4”,新对象[]{3,“John”,“Adwards”});
data.put(“5”,新对象[]{4,“Brian”,“Schultz”});
//迭代数据并写入工作表
Set keyset=data.keyset();
int rownum=0;
用于(字符串键:键集){
Row-Row=sheet.createRow(rownum++);
Object[]objArr=data.get(key);
int-cellnum=0;
用于(对象对象对象:对象对象对象){
Cell Cell=row.createCell(cellnum++);
if(字符串的obj实例)
cell.setCellValue((字符串)obj);
else if(obj instanceof Integer)
cell.setCellValue((整数)obj);
}
}
试一试{
//在文件系统中编写工作簿
FileOutputStream out=新的FileOutputStream(新文件(“howtodoinjava_demo.xlsx”);
练习册。写(出);
out.close();
System.out.println(“howtodoinjava_demo.xlsx已成功写入磁盘”);
}捕获(例外e){
e、 printStackTrace();
}
}
}对于自动调整大小的列,有。在那里,您可以指定合并单元格的内容应被考虑还是忽略。默认设置为忽略合并的单元格。但您的问题在这一点上并不十分清楚,因为您的代码根本不合并单元格 对于行样式,有<代码>Excel在将新单元格添加到此行时采用该样式。但是apachepoi的行为不是这样的。对于新创建的单元,它始终使用默认的单元样式。因此,我们需要一个方法
CellStyle getPreferredCellStyle(Cell 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.");
}
}
导入java.io.File;
导入java.io.FileOutputStream;
导入java.util.Map;
导入java.util.Set;
导入java.util.TreeMap;
导入org.apache.poi.ss.usermodel.*;
导入org.apache.poi.xssf.usermodel.xssf工作簿;
导入org.apache.poi.xssf.usermodel.XSSFCell;
导入org.apache.poi.hssf.usermodel.HSSFWorkbook;
导入org.apache.poi.hssf.usermodel.HSSFCell;
公共类WriteExcelDemo{
静态单元格样式getPreferredCellStyle(单元格){
//获取单元格首选单元格样式的方法
//这是已应用的单元样式
//或者,如果不存在,则为行样式(此行的默认单元格样式)
//或者,如果不存在,则为列样式(此列的默认单元格样式)
CellStyle CellStyle=cell.getCellStyle();
//如果未应用显式单元格样式,则cellStyle.getIndex()对于XSSF为0
//或HSSF的15(0xF=默认ExtendedFormatRecord(0xF)的索引)
如果((XSSFCell的单元格实例和&cellStyle.getIndex()=0)| |(HSSFCell的单元格实例和&cellStyle.getIndex()=15))cellStyle=cell.getRow().getRowStyle();
如果(cellStyle==null)cellStyle=cell.getSheet().getColumnStyle(cell.getColumnIndex());
如果(cellStyle==null)cellStyle=cell.getCellStyle();
返回单元格样式;
}
公共静态void main(字符串[]args)引发异常{
//空白工作簿XSSF或HSSF
工作簿=新的XSSF工作簿();
//工作簿=新的HSSF工作簿();
//在工作簿级别创建所需的单元格样式
Font boldFont=工作簿.createFont();
boldFont.setBold(true);
CellStyle headerRowStyle=workbook.createCellStyle();
headerRowStyle.setFont(粗体字体);
//需要写入此数据(对象[])
映射数据=新树映射();
data.put(“1”,新对象[]{“ID”,“NAME”,“LASTNAME”});
data.put(“2”,新对象[]{1,“Amit”,“Shukla”});
data.put(“3”,新对象[]{2,“Lokesh”,“Gupta”});
data.put(“4”,新对象[]{3,“John”,“Adwards”});
data.put(“5”,新对象[]{4,“Brian”,“Schultz”});
//创建空白工作表
工作表=工作簿.createSheet(“员工数据”);
//迭代数据并写入工作表
Set keyset=data.keyset();
int rownum=0;
用于(字符串键:键集){
Row-Row=sheet.createRow(rownum++);
if(rownum==1)row.setRowStyle(headerRowStyle);//第一行的行样式;向此行添加新单元格时,Excel采用该样式
Object[]objArr=data.get(key);
int-cellnum=0;
用于(对象对象对象:对象对象对象){
Cell Cell=row.createCell(cellnum++);
cell.setCellStyle(getPreferredCellStyle(cell));//像Excel那样为新单元格设置首选单元格样式
if(字符串的obj实例)
cell.setCellValue((字符串)obj);
else if(obj instanceof Integer)