Java Excel API的使用
Java Excel是开源项目,使用它可以用纯java来读取Excel文件的内容、创建Excel文件、更新已存在的Excel文件的内容,它不依赖于操作系统,这样可以使大家放心方便的操作Excel'文件。
搭建环境:下载jxl.jar文件,其包含java对Excel操作的类,把jxl.jar放到classpath下。
应用实例
从Excel中读取数据
Java Excel API可以从本地xls文件中读取数据,也可以从输入流中读取Excel数据表,读取的第一 步就是创建一个工作簿Workbook。
//获取文件输入流
InputStream fis=new FileInputStream(sourceFile);
//构建Workbook对象,这里是只读的Workbook对象
//也可以从本地文件中构建Workbook:Workbook.getWorkbook(new File(sourceFile)) jxl.Workbook wbook=Workbook.getWorkbook(fis);
创建Workbook后,可以通过它来访问Excel的sheet(工作表)
//获取第一个工作表对象,getSheet()中的参数表示第几张工作表,索引从0开始 jxl.Sheet sheet=wbook.getSheet(0);
//获取sheet的名字
String sheetName=sheet.getName();
获取Sheet后,可以用它访问Excel Cell(单元格)
//获取第一列第一行的单元格,getCell()中第一个参数是列,第二个参数是行 jxl.Cell cell=sheet.getCell(0,0);
//获取单元格的内容
String cellText=cell.getContents();
//获取单元格的类型,内容为空为Empty,不为空为Label类型
CellType type=cell.getType();
如果仅是活的Cell的内容,我们只用getContents()就可以了,这个方法返回的是字符串类型 操作完后,关闭Workbook对象,释放占用的内存空间
wbook.close();
注:
jxl.Workbook提供的方法
1,int getNumberOfSheets()获取工作簿中工作表的个数
jxl.Workbook wbook=Workbook.getWorkbook(sourceFile);
int sheets=wbook.getNumberOfSheets();
2,Sheet[] getSheets() 获取工作簿中的工作表对象的数组
Sheet[] sheets=wbook.getSheets();
3,String getVersion()返回正在使用的API的版本号,基本没用
String version=wbook.getVersion();
jxl.Sheet提供的方法
Sheet sheet=wbook.getSheet(0);
1,String getName()获取Sheet(工作表)的名字
String sheetName=sheet.getName();
2,int getColumns()获取Sheet表中包含的总列数
int cols=sheet.getColumns();
3,Cell[] getColumn(int column)获取某一列的所有单元格,返回单元格数组
Cell[] colCells=sheet.getColumn(column);
4,int getRows() 获取Sheet表中的包含的总行数
int rows=sheet.getRows();
5,Cell[] getRow(int row)获取某一行的所有单元格,返回单元格数组
Cell[] rowCells=sheet.getRow(row);
6,Cell getCell(column,row)根据列和行获取指定单元格
Cell cell=sheet.getCell(col,row);
生成新的Excel工作簿
Java Excel可以创建本地的xls文件,也可以写入到输出流,让客户端调用生成xls文件。 创建Excel文件的第一步是:利用Workbook创建一个可写入的工作簿(WritableWorkbook).
//创建文件输出流
OutputStream os=new FileOutputStream(targetFile);
//创建可写入的工作簿(writableWorkbook),这里是写入到输出流
//也可以直接写到文件中,Workbook.createWorkbook(targetFile);
jxl.WritableWorkbook wwbook=Workbook.createWorkbook(os);
创建工作簿完毕之后,开始创建可编辑的工作表(Sheet)。
//创建工作表有2个参数,第一个是sheet的名字,第二个是sheet在工作簿中的位置 WritableSheet sheet=wwbook.createSheet("sheetName",0);
设置字符串的格式
//第一个参数:字体WritableFont.TIMES;第二个参数是字号,数字类型
//第三个参数:WritableFont.BOLD或WritableFont.NO_BOLD
jxl.write.WritabelFont font=new WritableFont(字体,字号,粗体或非粗体);
设置带有字符串格式的format对象
jxl.write.WritableCellFormat format=new WritableFormat(font);
设置Label单元格对象,并加入到sheet工作表中
//创建label单元格直接加到sheet中,第一和第二个参数是制定列和行
//第三个参数是单元格内容,第四和是单元格内容的格式,也可以无第四个参数
jxl.Label label=new Label(col,row,content,format);
sheet.addCell(label);
设置Number对象,并加入到sheet工作表中
jxl.write.NumberFormat nFormat=new NumberFormat("#.##");
jxl.write.Number labelNum=new Number(col,row,number,nFormat);
sheet.addCell(labelNum);
添加Boolean对象
jxl.write.Boolean labelB=new Boolean(col,row,false);
sheet.addCell(labelB);
添加日期对象(带有format)
jxl.write.DateFormat dateFormat=new DateFormat("yyyy-MM-dd hh:mm:ss");
jxl.write.WritableCellFormat format=new WritableCellFormat(dateFormat);
jxl.write.DateTime date=new DateTime(col,row,new java.util.Date(),format);
sheet.addCell(date);
写入工作表
wwbook.write();
关闭工作表,释放内存空间
wwbook.close();
注:
jxl.WritableSheet提供的方法
1,mergeCells(startCol,startRow,endCol,endRow);合并单元格
2, sheet.setRowView(row, height);设置行高
3,sheet.setColumnView(column, width);设置列宽
jxl.write.WritableFormat提供的方法
1,format.setAlignment(jxl.format.Alignment.CENTRE)把水平方式定义为居中
2,format.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE)把垂直方式定为居中 3,format.setBorder(jxl.format.Border.ALL, jxl.format.BorderLineStyle.THIN)设置单元格 的边框
复制和更新Excel工作簿
创建只读的工作簿对象
jxl.Workbook wbook=WorkBook.getWorkbook(new File(sourceFile));
创建一个可编辑的副本
jxl.WritableWorkbook wwbook=Workbook.createWorkbook(new File("*.xls"),wbook); 然后可以用副本wwbook进行Excel表的更新,跟创建Excel表的流程一样
最后关闭写入到副本中
wwbook.write();
关闭副本和只读文件
wwbook.close();
wbook.close();
写Excel的方法类为JxlExcelWriter:
import jxl.Workbook;
import jxl.format.UnderlineStyle;
import jxl.format.Colour;
import jxl.write.*;
import jxl.write.biff.RowsExceededException;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Date;
import java.util.List;
public class JxlExcelWriter {
public void writeExcel(OutputStream out, List datas, String[] title) {
if (datas == null) {
throw new IllegalArgumentException("写excel流需要List参数!");
}
try {
WritableWorkbook workbook = Workbook.createWorkbook(out);
WritableSheet ws = workbook.createSheet("sheet1", 0);
int rowNum = 1; //要写的行
if (title != null) {
putDescription(ws);
putTitle(ws, 1, title);//压入标题
Object[] cells = (Object[]) datas.get(0);
putRow(ws, rowNum, cells); //压一行到sheet
}
int dataNum = 2; //要写的数据行
for(int i = 1; i < datas.size(); i++, dataNum++) { //把数据写进sheet
Object[] cells = (Object[]) datas.get(i);
putDatas(ws, dataNum, cells); //压入一行数据到sheet
}
putTime(ws); //压入时间
workbook.write();
workbook.close(); //一定要关闭, 否则没有保存Excel
} catch (RowsExceededException e) {
System.out.println("jxl write RowsExceededException: " + e.getMessage());
} catch (WriteException e) {
System.out.println("jxl write WriteException: " + e.getMessage());
} catch (IOException e) {
System.out.println("jxl write file i/o exception!, cause by: " + e.getMessage()); }
}
private void putTime(WritableSheet ws) throws RowsExceededException, WriteException {
DateFormat df = new DateFormat("yyyy-MM-dd hh:mm:ss");
WritableCellFormat wcfDF = new WritableCellFormat(df);
DateTime labelDT = new DateTime(4, 10, new Date(), wcfDF);
ws.addCell(labelDT);
}
private void putDescription(WritableSheet ws) throws RowsExceededException,WriteException{
WritableFont wfc = new WritableFont(WritableFont.ARIAL, 10, WritableFont.NO_BOLD, false, UnderlineStyle.NO_UNDERLINE, Colour.BLUE);
WritableCellFormat wcfFC = new WritableCellFormat(wfc);
String description = "合计与盘盈的数量(条)不区分(联通、网通)、是否上市"; String unit = "单位:元";
Label descriptions = new Label(2, 0, "" + description, wcfFC);
ws.addCell(descriptions);
Label units = new Label(4, 0, "" + unit);
ws.addCell(units);
}
private void putTitle(WritableSheet ws, int rowNum, Object[] titles) throws
RowsExceededException, WriteException {
for (int j = 1; j < titles.length + 1; j++) {//写一行
Label title = new Label(j, rowNum, "" + titles[j-1]);
ws.addCell(title);
}
}
private void putRow(WritableSheet ws, int rowNum, Object[] cells) throws
RowsExceededException, WriteException {
for (int j = 1; j < cells.length + 1; j++) {//写一行
Label cellRows = new Label(0, j, "" + cells[j-1]);
// Label(0, j, "" + "String") 表示列不变行变,也就是说在第0列有n行数据 ws.addCell(cellRows);
}
}
private void putDatas(WritableSheet ws, int dataNum, Object[] cells) throws
RowsExceededException, WriteException {
for (int j = 1; j < cells.length + 1; j++) {//写一行
Label cellRows = new Label(j, dataNum, "" + cells[j-1]);
ws.addCell(cellRows);
}
}
}
导出Excel的类为ExportLtTotalExcel:
import com.sino.ams.bean.JxlExcelWriter;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletOutputStream;
import java.util.List;
import java.util.ArrayList;
import java.util.StringTokenizer;
import java.io.*;
import java.sql.Connection;
public class ExportLtTotalExcel {
protected Connection conn = null; protected HttpServletResponse res = null; protected String fileName = "固定资产-清查总体情况表"; //保存Excel时的名字 public ExportLtTotalExcel(Connection conn, HttpServletResponse res) {
this.conn = conn;
this.res = res;
}
public ExportLtTotalExcel(HttpServletResponse res) {
this.res = res;
}
public void writeExcel(String[] normal, String[] free, String[] damaged, String[] loss, String[] total, String[] win) {
List datas = new ArrayList();
String[] rows = {"集团总部", "在用", "闲置", "损毁", "盘亏", "总部资产合计", "总部资产盘盈"};
String[] struct = {"原值", "累计折旧(或摊销)", "净值", "数量(条)"};
datas.add(rows);
datas.add(normal);
datas.add(free);
datas.add(damaged);
datas.add(loss);
datas.add(total);
datas.add(win);
try {
res.setContentType("application/vnd.ms-excel");
if (!fileName.equals("")) {
String header = "attachment; filename=" + new String((fileName
+ ".xls").getBytes(), "iso8859-1");
res.setHeader("Content-Disposition", header);
}
ServletOutputStream out = res.getOutputStream();
JxlExcelWriter jxlExcelWriter = new JxlExcelWriter();
jxlExcelWriter.writeExcel(out, datas, struct);
out.close();
res.flushBuffer();
} catch (IOException e) {
e.printStackTrace();
}
}
负责跟Web接口的Servlet类为LtAssetsTotalDataServlet:
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServlet;
public class LtAssetsTotalDataServlet extends HttpServlet {
public void performTask(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
String forwardURL = "";
Message message = SessionUtil.getMessage(req);
Connection conn = null;
try{
String action = dto.getAct();
conn = getDBConnection(req);
if (action.equals(AssetsActionConstant.EXPORT_ACTION)) {
//下面String[]数组中的值都是从Model里查出来的String型的字符串值 String[] normal = {normalCostS, normalDeprnReserveS, normalNetAssetValueS, normalTotalS};
String[] free = {freeCostS, freeDeprnReserveS, freeNetAssetValueS,
freetotalS};
String[] damaged = {damagedCostS, damagedDeprnReserveS,
damagedNetAssetValueS, damagedTotalS};
String[] loss = {lossCostS, lossDeprnReserveS, lossNetAssetValueS,
lossTotalS};
String[] total = {sumCostS, sumDeprnReserveS, sumNetAssetValueS, sumTotalS}; String[] win = {"", "", "", winTotalS};
ExportLtTotalExcel exportExcel = new ExportLtTotalExcel(res);
exportExcel.writeExcel(normal, free, damaged, loss, total, win);
forwardURL = AssetsURLList.LT_ASSETS_TOTAL;
}
}
}
自动套用格式:全选------“格式”菜单下的“自动套用格式”
设置边框线:选中----“格式”----单元格-----边框选项卡
字体设置: 选中--“格式”--单元格--字体选项卡
设置填充色:选中--“格式”--单元格--图案选项卡
对齐方式(水平、垂直):选中--“格式”-单元格--对齐选项卡
合并单元格:选中--“格式”--单元格--对齐选项卡下的“合并单元格” 货币格式: 选中--“格式”--单元格---数字选项卡下的货币
数字格式: 选中--“格式”--单元格--数字选项卡下的数值
最合适的列宽:选中列--“格式”--列----最合适的列宽
工作表:插入 右击工作表标签---选插入
重命名 右击工作表标签--选重命名
设置页脚: “视图”---页眉和页脚---自定义页脚
增加一列(行):选中位置,利用“插入”菜单下的列(行)
公式:
求和:光标定位到存放结果的单元格---点击编辑栏中的“=”---选择Sum----确定 求平均数:光标定位到存放结果的单元格---点击编辑栏中的“=”---选择Average---确定
排序:
全部 选中要排序的所有数据(标题不要选)--点击“数据”菜单下的排序 部分 单击要排序的数据的任意一个单元格-----点击工具栏上的升序降序按钮
自动筛选:选中数据,点击“数据”菜单下的“筛选”——“自动筛选” 图表:选中要设置图表的数据-----点击“插入”菜单下的图表
自动套用格式:全选------“格式”菜单下的“自动套用格式”设置边框线:选中----“格式”----单元格-----边框选项卡字…
Excel知识点总结一、工作表、工作簿的基本操作1.Excel文件是一个工作簿(Book1.xls),一个工作簿默认包括3张工作表…
创建图表的方法:1,选中后按F11生成图表2,视图,工具栏,图表在小栏里选需要的(外加阴影等工具,自定义,需要的拖动到图表工具栏)…
Excel总结开学四个星期过去了,也上了四次会计电算化的课,这四节课学了关于excel的基本操作,第一次课主要做了材料进出仓明细表…
C#′|àíExcel???t×ü?áéù?÷?ùóD?é?üó?μ?μ?±?á?ApplicationClassapp;Work…
今年以来,我****场坚持“安全第一、预防为主、综合治理”的方针,深入落实科学发展观,牢固树立安全发展理念,夯实基础,细化责任,强…
八峰民族学校20xx年学校对外宣传工作总结20xx年八峰民族学校紧紧围绕《鹤峰县教育宣传传工作实施方案》,认真贯彻党的十七届六中全…
20xx年我镇纪检监察工作在县纪委、监察局和镇党委政府的正确领导下,坚持以党的十七届六中全会精神为指导,深入贯彻落实科学发展观,围…
20xx年骨科护士的年终总结为您提供有关20xx年骨科护士年终总结的相关文章内容热门推荐,希望这些骨科护士年终总结的资料对您有帮助…
生命弥足珍贵,安全重于泰山,安全维系着社会的稳定,牵动着家庭的幸福,关系着未成年学生的健康成长。本学期,我校为进一步做好安全教育工…