Java实现生成Excel树形表头完整代码示例

本文主要分享了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:

第一行不属于树形表头。

代码

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<SplitCell> cellContents;
	private final int firstRowIndex;
	private final int rowSize;
	private Map<String, MergedCell> cellInfoMap = new LinkedHashMap<String, MergedCell>();
	public CellTransformer(List<SplitCell> cellContents, int firstRowIndex, int rowSize) {
		this.cellContents = cellContents;
		this.firstRowIndex = firstRowIndex;
		this.rowSize = rowSize;
	}
	public Map<String, MergedCell> 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<SplitCell> 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<String, MergedCell> 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)

相关推荐

  • Java如何将Excel数据导入到数据库

    本文实例为大家分享了Java将Excel数据导入到数据库的具体代码,供大家参考,具体内容如下 所用Jar包 1. sqljdbc4.jar 连接数据库的Jar包(根据数据库的不同进行选择,我用的SqlServer2008) 2.Jxl.jar 访问Excel的Jar包 package xsl; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; impo

  • Java 使用POI生成带联动下拉框的excel表格实例代码

    废话不多说了,直接给大家贴代码了,具体代码如下所示: import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.apache.poi.hssf.

  • Java实现excel表格转成json的方法

    今天有个朋友问我,有没有excel表格到处json的方法,在网上找到了好几个工具,都不太理想,于是根据自己的需求,自己写了一个工具. 功能代码 package org.duang.test; import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import net.sf.json.JSONArray; impo

  • java读取excel文件的两种方法

    本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下 方式一: 借用 package com.ij34.util; /** * @author Admin * @date 创建时间:2017年8月29日 下午2:07:59 * @version 1.0 *@type_name myclass */ import java.io.File; import java.io.IOException; import jxl.Cell; import jxl.Sheet;

  • Java对Excel表格的上传和下载处理方法

    Excel表格文件的上传和下载,java中涉及到文件肯定会有io流的知识. 而excel文件就要涉及到poi技术,而excel的版本包括:2003-2007和2010两个版本, 即excel的后缀名为:xls和xlsx. 这里我是按照正规的项目流程做的案例,所以可能会比网上的一些Demo复杂一些.不过文件的上传和下载基本都是一套固定的流程,只是每个人的实现方式不太相同. 数据库我用的是MySql. 下面是我的项目目录: 按照正常的项目做了分层处理,文件上传的业务我放到了service处理,而文件

  • Java实现Excel导入导出数据库的方法示例

    本文实例讲述了Java实现Excel导入导出数据库的方法.分享给大家供大家参考,具体如下: 由于公司需求,想通过Excel导入数据添加到数据库中,而导入的Excel的字段是不固定的,使用得通过动态创建数据表,每个Excel对应一张数据表,怎么动态创建数据表,可以参考前面一篇<java使用JDBC动态创建数据表及SQL预处理的方法>. 下面主要讲讲怎么将Excel导入到数据库中,直接上代码:干货走起~~ ExcellToObjectUtil 类 主要功能是讲Excel中的数据导入到数据库中,有几

  • Java实现批量导入excel表格数据到数据库中的方法

    本文实例讲述了Java实现批量导入excel表格数据到数据库中的方法.分享给大家供大家参考,具体如下: 1.创建导入抽象类 package com.gcloud.common.excel; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.PrintStream; import java.sql.SQLException;

  • 在java poi导入Excel通用工具类示例详解

    前言 本文主要给大家介绍了关于java poi导入Excel通用工具类的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 问题引入和分析 提示:如果不想看罗嗦的文章,可以直接到最后点击源码下载运行即可 最近在做一个导入Excel的功能,在做之前在百度上面查找"java通用导入Excel工具类",没有查到,大多数都是java通用导出Excel.后来仔细想想,导出可以利用java的反射,做成通用的,放进相应的实体成员变量中,导入为什么不可以呢?也是可以的,不过在做

  • Java实现生成Excel树形表头完整代码示例

    本文主要分享了Java实现生成Excel树形表头完整代码示例,没有什么好解释的,直接看看代码过程. 源数据格式: String[] targetNames = { "指标名称", "单位", "xx_yy1", "xx_yy2_zz1", "xx_yy2_zz2", "2017年5月_主营业务收入_累计", "2017年5月_主营业务收入_同比", "201

  • Java网络编程之TCP通信完整代码示例

    一.概述 Socket类是Java执行客户端TCP操作的基础类,这个类本身使用代码通过主机操作系统的本地TCP栈进行通信.Socket类的方法会建立和销毁连接,设置各种Socket选项. ServerSocket类是Java执行服务器端操作的基础类,该类运行于服务器,监听入站TCP连接,每个socket服务器监听服务器的某个端口,当远程主机的客户端尝试连接此端口时,服务器就被唤醒,并返回一个表示两台主机之间socket的正常Socket对象. 二.什么是TCP? TCP是一种面向连接的.可靠的.

  • Java加密解密和数字签名完整代码示例

    常见的加密算法 基本的单向加密算法: BASE64严格地说,属于编码格式,而非加密算法 MD5(MessageDigestalgorithm5,信息摘要算法) SHA(SecureHashAlgorithm,安全散列算法) HMAC(HashMessageAuthenticationCode,散列消息鉴别码) 复杂的对称加密(DES.PBE).非对称加密算法: DES(DataEncryptionStandard,数据加密算法) PBE(Password-basedencryption,基于密码

  • Java实现截图小工具的完整代码

    目录 写在前面 效果展示 代码展示 项目结构 设计思路 项目测试 写在前面 今天利用Java的图形用户界面GUI技术写了一个电脑截图小工具.本程序代码简单,涉及到异常处理,事件处理,图形用户界面等,是初学者练手的好项目.一起来学习吧! 效果展示 代码展示 import javax.imageio.ImageIO; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.

  • jquery实现树形菜单完整代码

    本实例实现了树形的动态菜单,兼容IE8,火狐,Chrome等浏览器.使用了jQuery的toggle() 方法.效果和代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/199

  • java算法实现红黑树完整代码示例

    红黑树 定义 红黑树(英语:Red–black tree)是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组. 红黑树的另一种定义是含有红黑链接并满足下列条件的二叉查找树: 红链接均为左链接:没有任何一个结点同时和两条红链接相连:该树是完美黑色平衡的,即任意空链接到根结点的路径上的黑链接数量相同. 满足这样定义的红黑树和相应的2-3树是一一对应的. 旋转 旋转又分为左旋和右旋.通常左旋操作用于将一个向右倾斜的红色链接旋转为向左链接.对比操作前后,可以看出,该操作

  • java通过JFrame做一个登录系统的界面完整代码示例

    在java的JFrame内通过创建匿名对象的方式做登录界面 package com.sxt; import java.awt.Container; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.J

  • Java中filter用法完整代码示例

    本文研究的主要是Java中filter过滤器的相关用法,具体实现代码如下. filter过滤器主要使用于前台向后台传递数据是的过滤操作.程度很简单就不说明了,直接给几个已经写好的代码: 一.使浏览器不缓存页面的过滤器 import javax.servlet.*; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * 用于的使 Browser 不缓存页面的过滤器 */ public cla

  • Java中的静态内部类详解及代码示例

    1. 什么是静态内部类 在Java中有静态代码块.静态变量.静态方法,当然也有静态类,但Java中的静态类只能是Java的内部类,也称为静态嵌套类.静态内部类的定义如下: public class OuterClass { static class StaticInnerClass { ... } } 在介绍静态内部类之前,首先要弄清楚静态内部类与Java其它内部类的区别. 2. 内部类 什么是内部类?将一个类的定义放在另一个类的内部,就是内部类.Java的内部类主要分为成员内部类.局部内部类.

  • Java探索之string字符串的应用代码示例

    String类中提供了丰富的用于操作字符串的方法. int indexOf(String str) 该方法用于返回当给定字符串在当前字符串中的位置,若当前字符串不包含给定字符串则返回-1. 重载的方法 int indexOf(String str,int formIndex),从指定下标处(包含)查询子串,返回返回当给定字符串在当前字符串中的位置,若当前字符串不包含给定字符串则返回-1. 用自己的算法实现startsWith和endsWith功能. package com.hz.practice

随机推荐