java表格 表头_Java实现生成Excel树形表头完整代码示例

本文提供了一个Java代码示例,展示了如何生成Excel的树形表头。通过解析源数据,创建并合并单元格,最终生成带有层次结构的Excel表头。
摘要由CSDN通过智能技术生成

本文主要分享了Java实现生成Excel树形表头完整代码示例,没有什么好解释的,直接看看代码过程。

源数据格式:

String[] targetNames = {

"指标名称",

"单位",

"xx_yy1",

"xx_yy2_zz1",

"xx_yy2_zz2",

"2017年5月_主营业务收入_累计", "2017年5月_主营业务收入_同比",

"2017年5月_主营业务收入_本月", "2017年5月_主营业务收入_环比",

"2017年5月_利润_累计", "2017年5月_利润_同比", "2017年5月_利润_本月", "2017年5月_利润_环比",

"2017年6月_主营业务收入_累计", "2017年6月_主营业务收入_同比",

"2017年6月_主营业务收入_本月", "2017年6月_主营业务收入_环比",

"2017年6月_利润_累计", "2017年6月_利润_同比", "2017年6月_利润_本月", "2017年6月_利润_环比"

};

生成如下Excel:

79db60fc8e41ac49b88c5588c9dacdf6.png

第一行不属于树形表头。

代码

SplitCell:

package com.zzj.excel;

public class SplitCell {

private String key;

private String parentKey;

private String value;

private int columnIndex;

private int rowIndex;

public SplitCell() {

}

public SplitCell(String key, String value) {

this.key = key;

this.value = value;

}

public SplitCell(String key, String parentKey, String value,

int columnIndex, int rowIndex) {

this.key = key;

this.parentKey = parentKey;

this.value = value;

this.columnIndex = columnIndex;

this.rowIndex = rowIndex;

}

public String getKey() {

return key;

}

public void setKey(String key) {

this.key = key;

}

public String getParentKey() {

return parentKey;

}

public void setParentKey(String parentKey) {

this.parentKey = parentKey;

}

public String getValue() {

return value;

}

public void setValue(String value) {

this.value = value;

}

public int getColumnIndex() {

return columnIndex;

}

public void setColumnIndex(int columnIndex) {

this.columnIndex = columnIndex;

}

public int getRowIndex() {

return rowIndex;

}

public void setRowIndex(int rowIndex) {

this.rowIndex = rowIndex;

}

@Override

public String toString() {

return "CellContent [key=" + key + ", parentKey=" + parentKey + ", value=" + value + ", columnIndex="

+ columnIndex + ", rowIndex=" + rowIndex + "]";

}

}

MergedCell:

package com.zzj.excel;

public class MergedCell {

private String key;

private String parentKey;

private String value;

private int startC;

private int endC;

private int startR;

private int endR;

private Boolean leaf = true;

// 默认叶子节点

public String getKey() {

return key;

}

public void setKey(String key) {

this.key = key;

}

public String getParentKey() {

return parentKey;

}

public void setParentKey(String parentKey) {

this.parentKey = parentKey;

}

public String getValue() {

return value;

}

public void setValue(String value) {

this.value = value;

}

public int getStartC() {

return startC;

}

public void setStartC(int startC) {

this.startC = startC;

}

public int getEndC() {

return endC;

}

public void setEndC(int endC) {

this.endC = endC;

}

/**

* 单元格合并结束列索引自增

*/

public void incEndC(){

this.endC++;

}

public int getStartR() {

return startR;

}

public void setStartR(int startR) {

this.startR = startR;

}

public int getEndR() {

return endR;

}

public void setEndR(int endR) {

this.endR = endR;

}

public Boolean isLeaf() {

return leaf;

}

public void setLeaf(Boolean leaf) {

this.leaf = leaf;

}

@Override

public String toString() {

return "CellInfo [key=" + key + ", parentKey=" + parentKey + ", value=" + value + ", startC=" + startC

+ ", endC=" + endC + ", startR=" + startR + ", endR=" + endR + ", leaf=" + leaf + "]";

}

}

CellTransformer:

package com.zzj.excel;

import java.util.LinkedHashMap;

import java.util.List;

import java.util.Map;

public class CellTransformer {

private final List cellContents;

private final int firstRowIndex;

private final int rowSize;

private Map cellInfoMap = new LinkedHashMap();

public CellTransformer(List cellContents, int firstRowIndex, int rowSize) {

this.cellContents = cellContents;

this.firstRowIndex = firstRowIndex;

this.rowSize = rowSize;

}

public Map transform(){

cellInfoMap.clear();

for (SplitCell cellContent : cellContents) {

MergedCell cellInfo = cellInfoMap.get(cellContent.getKey());

if (cellInfo == null) {

cellInfo = convertToCellInfo(cellContent);

cellInfoMap.put(cellInfo.getKey(), cellInfo);

} else {

/* 单元格出现多少次,则该单元格就合并多少列 */

cellInfo.incEndC();

// 列结束索引自增(用于列合并)

cellInfo.setLeaf(false);

// 只要重复出现,则为非叶子节点

}

}

// 行合并

for (MergedCell cellInfo : cellInfoMap.values()) {

if (cellInfo.isLeaf()) {

// 如果为叶子节点,则一定合并到最后一行

cellInfo.setEndR(firstRowIndex + rowSize - 1);

}

}

return cellInfoMap;

}

private MergedCell convertToCellInfo(SplitCell cellContent){

MergedCell cellInfo = new MergedCell();

cellInfo.setKey(cellContent.getKey());

cellInfo.setParentKey(cellContent.getParentKey());

cellInfo.setValue(cellContent.getValue());

cellInfo.setStartC(cellContent.getColumnIndex());

// 结束索引默认为开始索引

cellInfo.setEndC(cellContent.getColumnIndex());

cellInfo.setStartR(cellContent.getRowIndex());

// 结束索引默认为开始索引

cellInfo.setEndR(cellContent.getRowIndex());

return cellInfo;

}

}

测试

package com.zzj.excel;

import java.io.File;

import java.util.ArrayList;

import java.util.List;

import java.util.Map;

import jxl.Workbook;

import jxl.format.CellFormat;

import jxl.write.Label;

import jxl.write.WritableCellFormat;

import jxl.write.WritableFont;

import jxl.write.WritableSheet;

import jxl.write.WritableWorkbook;

public class Main {

private static final String SEPARATOR = "_";

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

String[] targetNames = {

"指标名称",

"单位",

"xx_yy1",

"xx_yy2_zz1",

"xx_yy2_zz2",

"2017年5月_主营业务收入_累计", "2017年5月_主营业务收入_同比",

"2017年5月_主营业务收入_本月", "2017年5月_主营业务收入_环比",

"2017年5月_利润_累计", "2017年5月_利润_同比", "2017年5月_利润_本月", "2017年5月_利润_环比",

"2017年6月_主营业务收入_累计", "2017年6月_主营业务收入_同比",

"2017年6月_主营业务收入_本月", "2017年6月_主营业务收入_环比",

"2017年6月_利润_累计", "2017年6月_利润_同比", "2017年6月_利润_本月", "2017年6月_利润_环比"

};

// 设第一行不属于树形表头

String[] extraNames = new String[targetNames.length];

for (int i = 0; i < extraNames.length; i++) {

extraNames[i] = "extra" + i;

}

final int firstTreeRowIndex = 1;

int rowSize = getRowSize(targetNames);

List cellContents = new ArrayList<>();

for (int i = 0; i < targetNames.length; i++) {

String[] values = targetNames[i].split(SEPARATOR);

for (int j = 0; j < values.length; j++) {

String value = values[j];

String key = getKey(values, j);

String parentKey = getParentKey(values, j);

SplitCell cellContent = new SplitCell(key, parentKey, value,

i, j + firstTreeRowIndex);

cellContents.add(cellContent);

}

}

WritableWorkbook workbook = Workbook.createWorkbook(new File("F:\\template.xls"));

CellFormat cellFormat = getCellFormat();

WritableSheet sheet = workbook.createSheet("template", 0);

// 第一行

for (int i = 0; i < extraNames.length; i++) {

Label label = new Label(i, 0, extraNames[i], cellFormat);

sheet.addCell(label);

}

// 树形表头

CellTransformer cellInfoManager = new CellTransformer(cellContents, firstTreeRowIndex, rowSize);

Map map = cellInfoManager.transform();

for (MergedCell cellInfo : map.values()) {

Label label = new Label(cellInfo.getStartC(),

cellInfo.getStartR(), cellInfo.getValue(), cellFormat);

if (cellInfo.getStartC() != cellInfo.getEndC()

|| cellInfo.getStartR() != cellInfo.getEndR()) {

sheet.mergeCells(cellInfo.getStartC(), cellInfo.getStartR(),

cellInfo.getEndC(), cellInfo.getEndR());

}

sheet.addCell(label);

}

workbook.write();

workbook.close();

System.out.println("导出成功!");

}

private static CellFormat getCellFormat() throws Exception{

WritableFont font = new WritableFont(WritableFont.ARIAL, 10, WritableFont.BOLD);

WritableCellFormat cellFormat = new WritableCellFormat();

cellFormat.setFont(font);

cellFormat.setAlignment(jxl.format.Alignment.CENTRE);

cellFormat.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);

cellFormat.setWrap(false);

return cellFormat;

}

private static int getRowSize(String[] targetNames) {

int rowSize = 0;

for (String t : targetNames) {

rowSize = Math.max(rowSize, t.split(SEPARATOR).length);

}

return rowSize;

}

private static String getKey(String[] values, int index){

StringBuffer sb = new StringBuffer();

for (int i = 0; i < (index + 1); i++) {

sb.append(values[i] + SEPARATOR);

}

sb.deleteCharAt(sb.length() - 1);

return sb.toString();

}

private static String getParentKey(String[] values, int index){

if (index == 0) {

return null;

}

return getKey(values, index - 1);

}

}

总结

以上就是本文关于Java实现生成Excel树形表头完整代码示例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以帮你生成动态的Excel表头。你可以使用Apache POI这个Java库来实现。以下是一个Java代码示例: ```java import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.util.CellRangeAddress; import java.io.FileOutputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.List; public class ExcelGenerator { public static void main(String[] args) { List<String> headers = new ArrayList<>(); headers.add("ID"); headers.add("Name"); headers.add("Email"); headers.add("Phone"); // Create a new workbook Workbook workbook = new HSSFWorkbook(); // Create a new sheet Sheet sheet = workbook.createSheet("Sheet1"); // Create a new row for the header Row headerRow = sheet.createRow(0); // Create a cell style for the header CellStyle headerCellStyle = workbook.createCellStyle(); headerCellStyle.setAlignment(CellStyle.ALIGN_CENTER); // Set the column width for each column sheet.setColumnWidth(0, 10000); sheet.setColumnWidth(1, 10000); sheet.setColumnWidth(2, 15000); sheet.setColumnWidth(3, 10000); // Generate the header cells dynamically for (int i = 0; i < headers.size(); i++) { Row currentRow = headerRow; int currentColumn = i; // Merge cells for the header sheet.addMergedRegion(new CellRangeAddress(0, 1, currentColumn, currentColumn)); // Create the header cell Row row = sheet.getRow(0); if (row == null) { row = sheet.createRow(0); } row.setHeight((short) 800); Cell headerCell = row.createCell(currentColumn); headerCell.setCellValue(headers.get(i)); headerCell.setCellStyle(headerCellStyle); // Create the second row of the header Row secondRow = sheet.getRow(1); if (secondRow == null) { secondRow = sheet.createRow(1); } // Set the data type for the header cell headerCell.setCellType(CellType.STRING); // Autofit the column width to fit the header text sheet.autoSizeColumn(i); } try { // Save the workbook to an OutputStream OutputStream outputStream = new FileOutputStream("example.xlsx"); workbook.write(outputStream); workbook.close(); } catch (Exception e) { e.printStackTrace(); } } } ``` 这段代码将生成一个包含动态表头Excel文件,并使用Apache POI库进行操作。你可以根据需要修改列的数量和列标题,以生成任意数量列的动态表头
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值