Jexcel实现按一定规则分割excel文件的方法
作者:鉴客 发布时间:2023-06-29 07:52:01
标签:Jexcel,excel
本文实例讲述了Jexcel实现按一定规则分割excel文件的方法。分享给大家供大家参考。具体如下:
现有一个excel文档,需要读取它并按照一定的规则,分割之,分割出来的每一段记录需要单独创建一个excel文档并写入其中,一定要保证单元格格式的一致性。
package edu.bjut.zhutong.excelParser;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import jxl.Cell;
import jxl.CellType;
import jxl.Sheet;
import jxl.Workbook;
import jxl.format.Alignment;
import jxl.format.Border;
import jxl.format.BorderLineStyle;
import jxl.format.Colour;
import jxl.format.VerticalAlignment;
import jxl.read.biff.BiffException;
import jxl.write.Label;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException;
public class ExcelParser {
public static void main(String[] args) {
Workbook wb = null;
try {
//获得了Workbook对象之后,就可以通过它得到Sheet(工作表)对象了
InputStream is = new FileInputStream("C:/excel/excel.xls");
wb = Workbook.getWorkbook(is);
// 获得第一个工作表对象
Sheet sheet = wb.getSheet(0);
//获得工作表的行数和列数
int rows = sheet.getRows();
int cols = sheet.getColumns();
System.out.println("一共 " + rows + " 行");
System.out.println("一共 " + cols + " 列");
int counter = 0; //工作表行游标
int fileCounts = 1; //用来标识创建的excel文档数目
while(counter<rows-1) {
//得到counter行的所有单元格
Cell[] rowCells = sheet.getRow(counter);
Cell cell0 = rowCells[0];
//判断单元格内容的类型
if(cell0.getType() == CellType.LABEL) {
System.out.println("正在解析第 " + fileCounts + " 个文件....");
//新建一个excel文档
File file = new File("C:/excel/excel" + fileCounts + ".xls");
WritableWorkbook wwb = Workbook.createWorkbook(file);
//设置excel文档的工作表
WritableSheet ws = wwb.createSheet("sheet1", 0);
//第一行合并第0到第8列
ws.mergeCells(0, 0, 8, 0);
//设置第7,8,9列的列宽
ws.setColumnView(6, 10);
ws.setColumnView(7, 45);
ws.setColumnView(8, 27);
//向新建的表中写入数据,首先第一行先写入标题
for(int k=0; k<rowCells.length; k++) {
//创建WritableFont对象用来格式化字体,这里是20号宋体,加粗
WritableFont wf = new WritableFont(WritableFont.createFont("宋体"), 20, WritableFont.BOLD, false);
//使用WritableFont创建单元格格式化对象
WritableCellFormat wcf = new WritableCellFormat(wf);
//设置水平对齐方式
wcf.setAlignment(Alignment.CENTRE);
//设置垂直对齐方式
wcf.setVerticalAlignment(VerticalAlignment.CENTRE);
//设置边框和颜色
wcf.setBorder(Border.ALL, BorderLineStyle.THIN, Colour.BLACK);
Cell cell = rowCells[k];
Label label = new Label(k,0,cell.getContents(),wcf);
//添加单元格到表中
ws.addCell(label);
//设置第一行的行高
ws.setRowView(0, 30*20, false);
}
//向新建的表中写入数据,第二行写入表头
for(int c=0; c<cols; c++) {
String colCon = sheet.getCell(c, 1).getContents();
WritableFont wf = new WritableFont(WritableFont.createFont("宋体"), 12, WritableFont.BOLD, false);
WritableCellFormat wcf = new WritableCellFormat(wf);
wcf.setAlignment(Alignment.CENTRE);
wcf.setVerticalAlignment(VerticalAlignment.CENTRE);
wcf.setBorder(Border.ALL, BorderLineStyle.THIN, Colour.BLACK);
ws.addCell(new Label(c,1,colCon,wcf));
ws.setRowView(1, 18*20, false);
}
int rowCounts = 1; //用来遍历50
counter++; //将游标移动到下一行
if(counter == 1) //如果游标到了第二行 ,就自动把游标移动到第三行,第二行不需要处理
counter = 2;
int rowIndex = 2; //每篇excel文档的游标
rowCells = sheet.getRow(counter);
cell0 = rowCells[0];
while(cell0.getType() == CellType.NUMBER && counter<rows-1) {
rowCells = sheet.getRow(counter);
for(int k=0; k<rowCells.length; k++) {
WritableFont wf = new WritableFont(WritableFont.createFont("宋体"), 12, WritableFont.NO_BOLD, false);
WritableCellFormat wcf = new WritableCellFormat(wf);
wcf.setAlignment(Alignment.CENTRE);
wcf.setVerticalAlignment(VerticalAlignment.CENTRE);
wcf.setBorder(Border.ALL, BorderLineStyle.THIN, Colour.BLACK);
Label label = new Label(k,rowIndex,rowCells[k].getContents(),wcf);
ws.addCell(label);
}
//用来处理备注列的边框
{
WritableFont wf = new WritableFont(WritableFont.createFont("宋体"), 12, WritableFont.NO_BOLD, false);
WritableCellFormat wcf = new WritableCellFormat(wf);
wcf.setAlignment(Alignment.CENTRE);
wcf.setVerticalAlignment(VerticalAlignment.CENTRE);
wcf.setBorder(Border.ALL, BorderLineStyle.THIN, Colour.BLACK);
Label label = new Label(8,rowIndex,"",wcf);
ws.addCell(label);
}
ws.setRowView(rowIndex, 18*20, false);
rowIndex++;
counter++;
cell0 = sheet.getRow(counter)[0];
}
wwb.write();
wwb.close();
fileCounts++;
}
}
System.out.println("程序执行结束....");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (BiffException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (RowsExceededException e) {
e.printStackTrace();
} catch (WriteException e) {
e.printStackTrace();
} finally {
wb.close(); //关闭Workbook对象
}
}
}
希望本文所述对大家的java程序设计有所帮助。


猜你喜欢
- 前言;Apache common-pool对象池介绍:对象生命周期、Config详解、代码说明对象生命周期Config详解maxActive
- Reflections通过扫描classpath,索引元数据,并且允许在运行时查询这些元数据。使用Reflections可以很轻松的获取以下
- preHandle: 预先处理,在目标的controller方法执行之前,进行处理postHandle: 在目标的con
- 说明:在阅读本篇文章之前建议大家先详细学习一下spring的相关知识,有助于更深刻的理解spirngboot的配置原理。一、什么是sprin
- 文档中添加印章可以起一定的作用,比如,防止文件随意被使用,或者确保文档内容的安全性和权威性。C#添加图片印章其实也有很多实现方法,这里我使用
- 微信的发送语音是有一个向上取消的,我们使用onTouchListener来监听手势,然后做出相应的操作就行了。直接上代码://语音操作对象p
- java集合的工具类Collections中提供了两种排序的方法,分别是:Collections.sort(List list)Collec
- using System.IO; using System.Collections;static string deleteComments
- 一、什么是特性特性(Attribute)是用于在运行时传递程序中各种元素(比如类、方法、结构、枚举、组件等)的行为信息的声明性标签。您可以通
- 本文实例讲述了java求最大公约数与最小公倍数的方法。分享给大家供大家参考,具体如下:Gongyueshu.java文件:package m
- 一个线程如何知道另一线程已经结束?Thread类提供了回答此问题的方法。有两种方法可以判定一个线程是否结束。第一,可以在线程中调用isAli
- 本文项目为大家分享了Java实现 * 面五子棋的具体代码,供大家参考,具体内容如下项目介绍:本次设计是基于知识点Java类和对象以及数组开发的
- 前言这个也是Java实验课程的一个作业,和Java实现简单的图形界面计算器一起做的,因为以前没有做过GUI编程,所以做的非常简陋,还有很多B
- 这篇文章首先介绍了在SpringBoot中如何获得项目的编译时间和版本号,并向外提供接口,然后介绍了介绍了新版maven获得时间戳时区错误的
- Spring p和c标签注入方式1.编写实体类package com.ming04.pojo;import lombok.AllArgsCo
- 1.服务配置中心1.1 服务配置中心介绍首先我们来看一下,微服务架构下关于配置文件的一些问题:1.配置文件相对分散。在一个微服务架构下,配置
- 由于最近项目更新功能比较的忙,也没时间去整理自己的知识点和管理自己的博客.在Android对手机相册中的图片的压缩和上传到服务器上,这样的功
- mybatis-plus实现in嵌套sql今天使用jeegboot看源码时发现用户权限部分的代码条件查询的inSql方法的用法:即sql中的
- 圆形识别方案识别流程判断是否为封闭图形;根据圆的方程,取输入点集中的1/6、3/6、5/6处的三个点,求得圆的方程,获取圆心及半径;取点集中
- Java读文件修改默认换行符Java默认换行符是'\n'。但有时数据并不以'\n'进行换行方法如下publi