package com.gxy.excel.util;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import jxl.Cell;
import jxl.CellType;
import jxl.DateCell;
import jxl.LabelCell;
import jxl.NumberCell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.format.Border;
import jxl.format.BorderLineStyle;
import jxl.format.Colour;
import jxl.format.UnderlineStyle;
import jxl.read.biff.BiffException;
import jxl.read.biff.WorkbookParser;
import jxl.write.DateFormat;
import jxl.write.DateTime;
import jxl.write.Label;
import jxl.write.Number;
import jxl.write.NumberFormat;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableImage;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException;
public class JxtCommon {
/*
* WorkbookParser.getWorkbook(InputStream 对象):创建一个WorkbookParser对象
* getSheets():返回工作薄(Workbook)中工作表(Sheet)对象数组 getSheet(int
* i):获得指定的sheet对象,i从0开始 getNumberOfSheets():获得工作薄中工作表sheet的个数
*/
// 创建excel
public static void createSheet(String path) {
// 创建可写入的工作簿对象
WritableWorkbook workBook = null;
// 创建工作表单
WritableSheet sheet1 = null;
try {
/**
* 注意xsl的结构: 一个工作簿(WorkBook)下可以包含一张或多张工作表单(Sheet),
* 一个工作表单下可以有一个或多个行(Row),一个行又可以有一个或多个单元格(Cell)
*/
// 通过io创建xsl文件
// 创建工作簿
workBook = Workbook.createWorkbook(new File(path));
// 创建工作表单
sheet1 = workBook.createSheet("第一页工作表", 0);
// 行数组
int[] sheet_rows = { 0, 1, 2, 3, 4, 5 };
// 列数组
int[] sheet_column = { 0, 1, 2, 3, 4, 5 };
for (int row : sheet_rows) {
for (int column : sheet_column) {
// 添加文本 列 , 行 , 文本
Label label = new Label(column, row, "第" + row + "行中的第"
+ column + "个数据");
// 添加文本内容到单元格
sheet1.addCell(label);
}
}
// 创建第二页工作表单
sheet1 = workBook.createSheet("第二页工作表", 1);
// 生成数字 列 行 值
Number number = new Number(0, 0, 234);
// 添加数字内容到单元格
sheet1.addCell(number);
number = new Number(0, 1, 66);
sheet1.addCell(number);
number = new Number(0, 2, 99);
sheet1.addCell(number);
number = new Number(1, 3, 33);
sheet1.addCell(number);
number = new Number(1, 4, 66);
sheet1.addCell(number);
number = new Number(1, 5, 99);
sheet1.addCell(number);
/**
* 生成图片元素 说明: excel只支持png格式的图片, WritableImage类的常用构造器参数说明:
* WritableImage(图片开始显示的列的初始位置,图片开始显示的行的初始位置,图片所占的列数,图片所占的行数,文件对象)
*/
WritableImage write = new WritableImage(2, 6, 6, 8, new File(
"f://preview.png"));
// 添加图片元素
sheet1.addImage(write);
// 把所有信息写入工作簿
workBook.write();
// 关闭工作簿
workBook.close();
// 关闭输出流
// outStream.close();
} catch (FileNotFoundException notfound) {
notfound.printStackTrace();
} catch (IOException io) {
io.printStackTrace();
} catch (WriteException write) {
write.printStackTrace();
}
System.out.println("xls文件生成成功");
}
/**
*
* @Title: createSheet
* @Description: TODO(这里用一句话描述这个方法的作用)
* @param @param path
* @param @param workbooks_number 工作表单个数
* @param @param rows_number 行数
* @param @param column_number 列数
* @return void 返回类型
*/
public static void createSheet(String path, int workbooks_number,
int rows_number, int column_number) {
// 创建可写入的工作簿对象
WritableWorkbook workBook = null;
// 创建工作表单
WritableSheet sheet1 = null;
try {
/**
* 注意xsl的结构: 一个工作簿(WorkBook)下可以包含一张或多张工作表单(Sheet),
* 一个工作表单下可以有一个或多个行(Row),一个行又可以有一个或多个单元格(Cell)
*/
// 通过io创建xsl文件
// 创建工作簿
workBook = Workbook.createWorkbook(new File(path));
// 循环创建工作表单
for (int i = 0; i < workbooks_number; i++) {
// 创建工作表单
sheet1 = workBook.createSheet("第" + i + "页工作表", i);
// 创建行数
for (int j = 0; j < rows_number; j++) {
// 创建列数
for (int x = 0; x < column_number; x++) {
// 添加文本 列 , 行 , 文本
Label label = new Label(x, j, "第" + j + "行中的第" + x
+ "个数据");
// 添加文本内容到单元格
sheet1.addCell(label);
}
}
}
/*
* // 创建第二页工作表单 sheet1 = workBook.createSheet("第二页工作表", 1); // 生成数字
* 列 行 值 Number number = new Number(0, 0, 234); // 添加数字内容到单元格
* sheet1.addCell(number); number = new Number(0, 1, 66);
* sheet1.addCell(number); number = new Number(0, 2, 99);
* sheet1.addCell(number);
*
* number = new Number(1, 3, 33); sheet1.addCell(number); number =
* new Number(1, 4, 66); sheet1.addCell(number); number = new
* Number(1, 5, 99); sheet1.addCell(number);
*//**
* 生成图片元素 说明: excel只支持png格式的图片, WritableImage类的常用构造器参数说明:
* WritableImage(图片开始显示的列的初始位置,图片开始显示的行的初始位置,图片所占的列数,图片所占的行数,文件对象)
*/
/*
* WritableImage write = new WritableImage(2, 6, 6, 8, new File(
* "f://preview.png")); // 添加图片元素 sheet1.addImage(write);
*/
// 把所有信息写入工作簿
workBook.write();
// 关闭工作簿
workBook.close();
// 关闭输出流
// outStream.close();
} catch (FileNotFoundException notfound) {
notfound.printStackTrace();
} catch (IOException io) {
io.printStackTrace();
} catch (WriteException write) {
write.printStackTrace();
}
System.out.println("xls文件生成成功");
}
// 读取excel文件数据
public static void readExcel(String path) {
// 创建工作簿对象
Workbook book = null;
try {
// 建立工作簿
book = Workbook.getWorkbook(new File(path));
// 从工作簿中得到所有的工作表单
Sheet[] sheets = book.getSheets();
System.out.println("获得工作薄中工作表sheet的个数==" + sheets.length);
// 使用循环读取所有工作表单的内容
for (Sheet sh : sheets) {
// 获得sheet的名称
String sheetname = sh.getName();
System.out.println("获得sheet的名称==" + sheetname);
// 总行数
int rows = sh.getRows();
System.out.println("获得sheet中所包含的总行数" + rows);
// 总列数
int cols = sh.getColumns();
System.out.println("获得sheet中所包含的总列数==" + cols);
Cell cell = null;
// 行循环
for (int i = 0; i < rows; i++) {
// 列循环
for (int j = 0; j < cols; j++) {
// 第一个是列数,第二个是行数
cell = sh.getCell(j, i);
// 获取单元格内容
String cellContent = cell.getContents();
System.out.println(sh.getName() + "第" + i + "行第" + j
+ "列单元格内容是:" + cellContent);
// 字符串
if (cell.getType() == CellType.LABEL) {
System.out.println("===dddddddddddddddddddddddddddddddddddddddddddddddd="+cell.getType());
System.out.println("ggggggggggggggggggggggg="+CellType.NUMBER);
LabelCell labelc00 = (LabelCell) cell;
String strc00 = labelc00.getString();
System.out.println("字符串===" + strc00);
}
// 数字
if (cell.getType() == CellType.NUMBER) {
System.out.println("===dddddddddddddddddddddddddddddddddddddddddddddddd="+cell.getType());
System.out.println("ggggggggggggggggggggggg="+CellType.NUMBER);
NumberCell number00 = (NumberCell) cell;
double strc00 = number00.getValue();
System.out.println("数字===" + strc00);
}
// 时间
if (cell.getType() == CellType.DATE) {
DateCell datec00 = (DateCell) cell;
Date strc00 = datec00.getDate();
System.out.println("日期===" + strc00);
}
}
}
}
book.close();
} catch (Exception e) {
e.printStackTrace();
}
}
// 修改excel文件中数据
public static void updateExcel(String path) {
// 创建工作簿对象
Workbook inBook = null;
// 创建可写入的工作簿对象
WritableWorkbook newBook = null;
try {
// 读取xls文件
File inStream = new File(path);
// 建立输入工作簿
inBook = Workbook.getWorkbook(inStream);
// 通过输入工作簿建立新的写操作工作簿
newBook = Workbook.createWorkbook(inStream, inBook);
// 从工作簿中得到所有的工作表单
WritableSheet[] sheets = newBook.getSheets();
// 使用循环读取所有工作表单的内容
for (WritableSheet sh : sheets) {
// 获取Sheet表中所包含的总列数
int cols = sh.getColumns();
// 获取Sheet表中所包含的总行数
int rows = sh.getRows();
Cell cell = null;
// 行循环
for (int i = 0; i < rows; i++) {
// 列循环
for (int j = 0; j < cols; j++) {
// 第一个是列数,第二个是行数
cell = sh.getCell(j, i);
// 获取单元格内容
String cellContent = cell.getContents();
if (cellContent.equals("张倩")) {
Label label = new Label(j, i, "小名");
sh.addCell(label);
System.out.println("修改成功");
}
System.out.println(sh.getName() + "第" + i + "行第" + j
+ "列单元格内容是:" + cellContent);
}
}
}
inBook.close();
newBook.write();
newBook.close();
} catch (Exception e) {
e.printStackTrace();
}
}
// 根据条件删除excel文件中数据
public void delExcel(String path) {
// 创建工作簿对象
Workbook inBook = null;
// 创建可写的工作簿对象
WritableWorkbook newBook = null;
try {
// 读取xls文件
File inStream = new File(path);
// 建立输入工作簿
inBook = Workbook.getWorkbook(inStream);
// 通过输入工作簿建立新的写操作工作簿
newBook = Workbook.createWorkbook(inStream, inBook);
// 从工作簿中得到所有的工作表单
WritableSheet[] sheets = newBook.getSheets();
// 使用循环读取所有工作表单的内容
for (WritableSheet sh : sheets) {
// 总列数
int cols = sh.getColumns();
// 总行数
int rows = sh.getRows();
Cell cell = null;
// 行循环
for (int i = 0; i < rows; i++) {
// 列循环
for (int j = 0; j < cols; j++) {
// 第一个是列数,第二个是行数
cell = sh.getCell(j, i);
// 获取单元格内容
String cellContent = cell.getContents();
System.out.println("cellContent=====" + cellContent);
if (cellContent.equals("小名")) {
// 根据查询条件把单元格置空
Label label = new Label(j, i, "张倩");
sh.addCell(label);
// 根据查询条件删除列数据
// sh.removeColumn(j+2);
// 根据查询条件删除行数据
sh.removeRow(j + 4);
System.out.println("数据删除成功");
}
System.out.println(sh.getName() + "第" + i + "行第" + j
+ "列单元格内容是:" + cellContent);
}
}
}
inBook.close();
newBook.write();
newBook.close();
} catch (Exception e) {
e.printStackTrace();
}
}
// 创建create_excel
public static void create_excel(String path) {
try {
File file = new File(path);
if (!file.exists()) {
file.createNewFile();
}
WritableWorkbook wwb = Workbook.createWorkbook(file);
WritableSheet ws = wwb.createSheet("testexcel", 0);
Label lable = null;
// 对中文的支持非常好
lable = new Label(0, 0, "我的中国心");
ws.addCell(lable);
// 可以定义模板格式化你的cell
WritableFont wf = new WritableFont(WritableFont.ARIAL, 10,
WritableFont.NO_BOLD, false, UnderlineStyle.NO_UNDERLINE,
Colour.BLACK);
WritableCellFormat wcf = new WritableCellFormat(wf);
wcf.setBackground(Colour.WHITE);
lable = new Label(0, 1, "fdsl", wcf);
ws.addCell(lable);
wf = new WritableFont(WritableFont.TIMES, 18, WritableFont.BOLD,
true);
wcf = new WritableCellFormat(wf);
lable = new Label(0, 2, "aming", wcf);
ws.addCell(lable);
// cell的类型同样可以定义为数字类型
Number nb = new Number(0, 3, 21.4321321);
ws.addCell(nb);
// 支持格式化你的数字串
NumberFormat nf = new NumberFormat("#.###");
wcf = new WritableCellFormat(nf);
nb = new Number(0, 4, 21.43254354354354, wcf);
ws.addCell(nb);
// cell的类型可以为boolean类型
// Boolean bl = new Boolean(0,5,true);
// ws.addCell(bl);
// cell的类型同样可以为日期,时间
DateTime dt = new DateTime(0, 6, new Date());
ws.addCell(dt);
// 并且可以很好格式化你的日期格式
DateFormat df = new DateFormat("MM dd yyyy hh:mm:ss");
wcf = new WritableCellFormat(df);
dt = new DateTime(0, 7, new Date(), wcf);
ws.addCell(dt);
// 开始写文件了
wwb.write();
wwb.close();
} catch (Exception e) {
e.printStackTrace();
}
}
// 利用jxl.jar包向excle表格写数据
public static void writeDataToExcel(String path) throws IOException,
RowsExceededException, WriteException {
File file = new File(path);
// 构造Workbook对象,只读Workbook对象
// Method1:创建可写入的excle工作簿
WritableWorkbook wwb1 = Workbook.createWorkbook(file);
// Method2:将WritableWorkbook直接写入到输出流
// OutputStream os = new FileOutputStream(path);
// WritableWorkbook wwb2 = Workbook.createWorkbook(os);
// 创建Excel工作表
WritableSheet ws = wwb1.createSheet("值班表", 0);// arg0,表示sheet的名称,arg1表示第几个sheet,下标从0开始
// 设置列的宽度、设置行的高度 jxl中20个高度对应excel的1个高度,jxl的1个宽度对应excel的7个宽度
// 设置列宽,所有列
ws.getSettings().setDefaultColumnWidth(25);
// 设置行高,所有行
ws.getSettings().setDefaultRowHeight(600);
// 设置列宽,第一个参数为第几列,第二个参数为列宽
ws.setColumnView(0, 20);
// 设置行高,第一个参数为第几行,第二个参数为行高
ws.setRowView(0, 800);
// 是否显示网格 默认为true显示网格
ws.getSettings().setShowGridLines(true);
// 添加Label对象 列 行 内容
Label labelC = new Label(0, 0, "夕阳");
ws.addCell(labelC);
// 创建带有字型Formatting的对象 字体 字号 加粗 是否是斜体字
WritableFont wf = new WritableFont(WritableFont.TIMES, 18,
WritableFont.BOLD, true);
WritableCellFormat wcfF = new WritableCellFormat(wf);
// 下面Label构造函数参数意思依次为:列数、行数、要写入的内容、这个Label的样式(可选)
Label labelCF = new Label(1, 0, "创建带有字型Formatting的对象", wcfF);
ws.addCell(labelCF);
// 创建带有字体颜色Formatting的对象 居中对齐 10 号字体 无边框 字体颜色为红色
WritableFont wfc = new WritableFont(WritableFont.ARIAL, 10,
WritableFont.NO_BOLD, false, UnderlineStyle.NO_UNDERLINE,
Colour.RED);
WritableCellFormat wcfFC = new WritableCellFormat(wfc);
wcfFC.setAlignment(jxl.format.Alignment.LEFT);// 设置水平对齐方式为居中
wcfFC.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);// 把垂直对齐方式指定为居中
wcfFC.setWrap(true);// 设置自动换行
Label labelCFC = new Label(2, 0, "创建带有字体颜色Formatting的对象", wcfFC);
ws.addCell(labelCFC);
// 添加Number对象
NumberFormat nf = new NumberFormat("#.##");// 构造函数的#.##表示保留两位小数
WritableCellFormat wcfN = new WritableCellFormat(nf);
jxl.write.Number labelNF = new jxl.write.Number(1, 1, 3.1415926, wcfN);
ws.addCell(labelNF);
// 添加Boolean对象
jxl.write.Boolean labelB = new jxl.write.Boolean(0, 2, false);// 参数依次为:列数、行数、值
ws.addCell(labelB);
// 添加DateTime对象
DateTime labelDT = new jxl.write.DateTime(0, 3, new java.util.Date());
ws.addCell(labelDT);
// 添加带有formatting的DateFormat对象
jxl.write.DateFormat df = new jxl.write.DateFormat(
"dd MM yyyy hh:mm:ss");// 设置日期的格式
WritableCellFormat wcfDF = new WritableCellFormat(df);
DateTime labelDTF = new DateTime(1, 3, new java.util.Date(), wcfDF);
ws.addCell(labelDTF);
// (8)添加图片 只支持PNG格式的图片
File image = new File("f://preview.png");
// 前两位是起始格,后两位是图片占多少个格,并非是位置,四个参数的类型都是double,依次是 x, y, width, height,注意,
// 这里的宽和高可不是图片的宽和高,而是图片所要占的单位格的个数
WritableImage wimage = new WritableImage(3, 6, 4, 8, image);
ws.addImage(wimage);
// (10)添加批注
Label labelStr = new Label(1, 10, "");
// 合并单元格 co1 row1 co2 row2
ws.mergeCells(3, 0, 5, 0);// 合并第一行的第4列到第6列 水平方向
ws.mergeCells(3, 1, 3, 5);// 合并第4列的的第二行到第六行 垂直方向
ws.mergeCells(1, 6, 2, 9);
// 设置边框
WritableCellFormat wcsB = new WritableCellFormat();
wcsB.setBorder(Border.ALL, BorderLineStyle.DOUBLE);
wcsB.setBackground(Colour.GREEN);// 背景色
Label border = new Label(1, 4, "边框设置", wcsB);
ws.addCell(border);
// 写入excle工作表
wwb1.write();
System.out.println("利用jxl向excle写入数据完成");
// 关闭excle工作簿对象
wwb1.close();
}
// 利用jxl.jar包取excle表格的数据
public static void getExcelData(String path) throws BiffException,
IOException {
InputStream is = new FileInputStream(path);
WorkbookParser rwb = (WorkbookParser) WorkbookParser.getWorkbook(is);
System.out.println("获得工作薄中工作表sheet的个数=" + rwb.getNumberOfSheets());
Sheet[] sheets = rwb.getSheets();// 返回工作薄(Workbook)中工作表(Sheet)对象数组
Sheet rs = rwb.getSheet(0);
System.out.println("获得sheet的名称=" + rs.getName());
System.out.println("获得sheet中所包含的总列数=" + rs.getColumns());
System.out.println("获得sheet中所包含的总行数=" + rs.getRows());
Cell[] cells1 = rs.getColumn(0);// 获取某一列所有的单元格
System.out.println("cells1======" + cells1.length);
Cell[] cells2 = rs.getRow(0);// 获取某一行的所有单元格
Cell c00 = rs.getCell(0, 0);// 第一个是列数,第二个是行数
// 获取单元格内容
String contents = c00.getContents();// getContents()将任何类型的Cell值都作为一个字符串返回
System.out.println("content====" + contents);
// 字符串
if (c00.getType() == CellType.LABEL) {
LabelCell labelc00 = (LabelCell) c00;
String strc00 = labelc00.getString();
System.out.println(strc00);
}
// 数字
if (c00.getType() == CellType.NUMBER) {
NumberCell number00 = (NumberCell) c00;
double strc00 = number00.getValue();
System.out.println(strc00);
}
// 时间
if (c00.getType() == CellType.DATE) {
DateCell datec00 = (DateCell) c00;
Date strc00 = datec00.getDate();
System.out.println(strc00);
}
rwb.close();
is.close();
}
}