⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mergegroupandfreezecells.java

📁 实现java 操作Excel文件 可实现创建、读取、设置样式Excel文件
💻 JAVA
字号:
package cn.indoing.poi.chap3;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.Region;

public class MergeGroupAndFreezeCells
{
	public static void main(String[] args) throws IOException
	{
		HSSFWorkbook wb = new HSSFWorkbook();
		HSSFSheet st = wb.createSheet();

		// 这里首先创建一个单元格样式对象,设置了四周的边框以及字体可以换行
		// 其中的字体换行是用来竖向显示其中的一个单元格的
		// 更好的一点儿做法是再做一个单独的单元格样式对象
		// 要不然在处理自动列宽的时候可能会有点儿小问题
		HSSFCellStyle normalStyle = wb.createCellStyle();
		normalStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
		normalStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
		normalStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
		normalStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
		normalStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
		normalStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
		normalStyle.setWrapText(true);

		// 合并单元格A1-C1,填入内容的时候添到第一个格子里就可以
		// 但是注意一点:单元格合并後设置边框只在原第一个上有效,
		// 如果想应用的合并後的整体,则需要一个个的Create出单元格并应用样式
		// 这个明显是一个不太方便的操作,期待POI下一版的改进了
		st.addMergedRegion(new Region(0, (short) 0, 0, (short) 2));
		HSSFRow row = st.createRow(0);
		HSSFCell cell = row.createCell((short) 0);
		cell.setCellValue(new HSSFRichTextString("业务一览表"));
		cell.setCellStyle(normalStyle);
		row.createCell((short) 1).setCellStyle(normalStyle);
		row.createCell((short) 2).setCellStyle(normalStyle);

		// 设置列头,当然也可以一个一个格子的写,用循环感觉有些取巧而已
		// 同样,需要单独给每个单元格应用样式对象
		String[] seasonName = { "第一季度", "第二季度", "第三季度", "第四季度" };
		for (short i = 3; i < 7; i++)
		{
			cell = row.createCell(i);
			cell.setCellValue(new HSSFRichTextString(seasonName[i - 3]));
			cell.setCellStyle(normalStyle);
		}

		// 这个是竖排文字的实现
		// 目前POI没找到(或许没提供,或许我无知)让文字竖排的方法,
		// HSSFCellStyle.setRotation()方法是设置旋转角度的,和竖排不太一样,
		// 后来想了一下,因为只有中文等全角字符才有竖排的可能,
		// 一个英文单词要是竖排看起来恐怕会非常怪异,不过不排除搞艺术的……
		st.addMergedRegion(new Region(1, (short) 0, 6, (short) 0));
		row = st.createRow(1);
		cell = row.createCell((short) 0);
		cell.setCellValue(new HSSFRichTextString("地\n区\n代\n理\nA"));
		cell.setCellStyle(normalStyle);
		for (int i = 2; i < 7; i++)
			st.createRow(i).createCell((short) 0).setCellStyle(normalStyle);

		// 属于地区的二级分类,竖向合并相邻的两个单元格,其他同上
		String[] shopName = { "连锁店A", "连锁店B", "连锁店C" };
		for (int i = 1; i < 6; i = i + 2)
		{
			row = st.createRow(i);
			cell = row.createCell((short) 1);
			cell.setCellValue(new HSSFRichTextString(shopName[(i - 1) / 2]));
			cell.setCellStyle(normalStyle);
			st.createRow(i + 1).createCell((short) 1).setCellStyle(normalStyle);
			st.addMergedRegion(new Region(i, (short) 1, i + 1, (short) 1));
		}

		// 属于连锁店的下一级,基本也是创建出来然后赋值+应用样式
		for (int i = 1; i < 7; i = i + 2)
		{
			cell = st.getRow(i).createCell((short) 2);
			cell.setCellValue(new HSSFRichTextString("收入"));
			cell.setCellStyle(normalStyle);
			cell = st.getRow(i + 1).createCell((short) 2);
			cell.setCellValue(new HSSFRichTextString("支出"));
			cell.setCellStyle(normalStyle);
		}

		// 数据部分,直接Create然后应用样式,有数据的话这个地方就打数据好了
		for (int i = 1; i < 7; i++)
			for (short j = 3; j < 7; j++)
				st.createRow(i).createCell(j).setCellStyle(normalStyle);

		// 冻结Excel的窗口,边界为数据部分的边界
		st.createFreezePane(3, 1);

		// 按照连锁店级别分组(当然实际情况这样分组没啥意义)
		for (int i = 1; i < 7; i = i + 2)
			st.groupRow(i, i);

		// 按照地区分组
		st.groupRow(1, 5);

		OutputStream outputStream = new FileOutputStream("c:/a.xls");
		wb.write(outputStream);
		outputStream.close();
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -