java操作excel


JXL 操作 Excel Jxl create 代码 java 表格操作类库 jxl poi jxl 是一个韩国人写的 java 操作 excel 的工具, 在开源世界中,有两套比较有影响的 API 可供使用,一 个是 POI,一个是 jExcelAPI。其中功能相对 POI 比较弱一点。但 jExcelAPI 对中文支持非常好,API 是纯 Java 的, 并不依赖 Windows 系统,即使运行在 Linux 下,它同样能够正确的处理 Excel 文件。 另 外需要说明的是,这套 API 对图形和图表的支持很有限,而且仅仅识别 PNG 格式。 使用如下: 搭建环境 将下载后的文件解包,得到 jxl.jar,放入 classpath,安装就完成了。 基本操作 一、创建、写入文件 拟生成一个名为“test.xls”的 Excel 文件,其中第一个工作表被命名为 “第一页”,大致效果如下: package test; // 生成 Excel 的类 import java.io.File; import jxl.Workbook; import jxl.write.Label; import jxl.write.WritableSheet; import jxl.write.WritableWorkbook; public class CreateExcel { public static void main(String args[]) { try { // 打开文件 WritableWorkbook book = Workbook.createWorkbook( new File( " test.xls " )); // 生成名为“第一页”的工作表,参数 0 表示这是第一页 WritableSheet sheet = book.createSheet( " 第一页 " , 0 ); // 在 Label 对象的构造子中指名单元格位置是第一列第一行(0,0) // 以及单元格内容为 test Label label = new Label( 0 , 0 , " test " ); // 将定义好的单元格添加到工作表中 sheet.addCell(label); /* * 生成一个保存数字的单元格 必须使用 Number 的完整包路径,否则有语法歧义 单元格位置 是第二列,第一行,值为 789.123 */ jxl.write.Number number = new jxl.write.Number( 1 , 0 , 555.12541 ); sheet.addCell(number); // 写入数据并关闭文件 book.write(); book.close(); } catch (Exception e) { System.out.println(e); } } } 编译执行后,会产生一个 Excel 文件。 二、读取文件 以刚才我们创建的 Excel 文件为例,做一个简单的读取操作,程序代码如下: package test; // 读取 Excel 的类 import java.io.File; import jxl.Cell; import jxl.Sheet; import jxl.Workbook; public class ReadExcel { public static void main(String args[]) { try { Workbook book = Workbook.getWorkbook( new File( " test.xls " )); // 获得第一个工作表对象 Sheet sheet = book.getSheet( 0 ); // 得到第一列第一行的单元格 Cell cell1 = sheet.getCell( 0 , 0 ); String result = cell1.getContents(); System.out.println(result); book.close(); } catch (Exception e) { System.out.println(e); } } } 程序执行结果:test 三、修改文件 利用 jExcelAPI 可以修改已有的 Excel 文件,修改 Excel 文件的时候,除了打开文件的方式不同之外, 其他操作和创建 Excel 是一样的。下面的例子是在我们已经生成的 Excel 文件中添加一个工作表: package test; import java.io.File; import jxl.Workbook; import jxl.write.Label; import jxl.write.WritableSheet; import jxl.write.WritableWorkbook; public class UpdateExcel { public static void main(String args[]) { try { // Excel 获得文件 Workbook wb = Workbook.getWorkbook( new File( " test.xls " )); // 打开一个文件的副本,并且指定数据写回到原文件 WritableWorkbook book = Workbook.createWorkbook( new File( " test.xls " ), wb); // 添加一个工作表 WritableSheet sheet = book.createSheet( " 第二页 " , 1 ); sheet.addCell( new Label( 0 , 0 , " 第二页的测试数据 " )); book.write(); book.close(); } catch (Exception e) { System.out.println(e); } } } 其他操作 一、 数据格式化 在 Excel 中不涉及复杂的数据类型,能够比较好的处理字串、数字和日期已经能够满足一般的应用。 1、 字串格式化 字符串的格式化涉及到的是字体、粗细、字号等元素,这些功能主要由 WritableFont 和 WritableCellFormat 类来负责。假设我们在生成一个含有字串的单元格时,使用如下语句, 为方便叙述,我们为每一行命令加了编号: WritableFont font1 = new WritableFont(WritableFont.TIMES, 16 ,WritableFont.BOLD); //① WritableCellFormat format1 = new WritableCellFormat(font1); //② Label label = new Label( 0 , 0 ,”data 4 test”,format1) //③ 其中①指定了字串格式:字体为 TIMES,字号 16,加粗显示。WritableFont 有非常丰富的 构造子,供不同情况下使用,jExcelAPI 的 java-doc 中有详细列表,这里不再列出。 ②处代码使用了 WritableCellFormat 类,这个类非常重要,通过它可以指定单元格的各种 属性,后面的单元格格式化中会有更多描述。 ③处使用了 Label 类的构造子,指定了字串被赋予那种格式。 在 WritableCellFormat 类中,还有一个很重要的方法是指定数据的对齐方式,比如针对我们 上面的实例,可以指定: // 把水平对齐方式指定为居中 format1.setAlignment(jxl.format.Alignment.CENTRE); // 把垂直对齐方式指定为居中 format1.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE); 二、单元格操作 Excel 中很重要的一部分是对单元格的操作,比如行高、列宽、单元格合并等,所幸 jExcelAPI 提供了这些支持。这些操作相对比较简单,下面只介绍一下相关的 API。 1、 合并单元格 WritableSheet.mergeCells( int m, int n, int p, int q); // 作用是从(m,n)到(p,q)的单元格全部合 并,比如: WritableSheet sheet = book.createSheet(“第一页”, 0 ); // 合并第一列第一行到第六列第一行的所 有单元格 sheet.mergeCells( 0 , 0 , 5 , 0 ); 合并既可以是横向的,也可以是纵向的。合并后的单元格不能再次进行合并,否则会触发异常。 2、 行高和列宽 WritableSheet.setRowView( int i, int height); // 作用是指定第 i+1 行的高度,比如: // 将第一行的高度设为 200 sheet.setRowView( 0 , 200 ); WritableSheet.setColumnView( int i, int width); // 作用是指定第 i+1 列的宽度,比如: // 将第一列的宽度设为 30 sheet.setColumnView( 0 , 30 ); jExcelAPI 还有其他的一些功能,比如插入图片等,这里就不再一一介绍,读者可以自己探索。 其中:如果读一个 excel,需要知道它有多少行和多少列,如下操作: Workbook book = Workbook.getWorkbook( new File( " 测试 1.xls " )); // 获得第一个工作 表对象 Sheet sheet = book.getSheet( 0 ); // 得到第一列第一行的单元格 int columnum = sheet.getColumns(); // 得到列数 int rownum = sheet.getRows(); // 得到行数 System.out.println(columnum); System.out.println(rownum); for ( int i = 0 ; i < rownum; i ++ ) // 循环进行读写 { for ( int j = 0 ; j < columnum; j ++ ) { Cell cell1 = sheet.getCell(j, i); String result = cell1.getContents(); System.out.print(result); System.out.print( " \t " ); } System.out.println(); } book.close(); } 将 Excel 文件内容写入到数据库 代码 public class EStudentInsertExcelController extends SimpleFormController { private IStudent_infoManage studentManage; @Override protected ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response, Object command, BindException errors) throws Exception { Student_info student_info = (Student_info) command; try { MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; MultipartFile file = multipartRequest.getFile( " Excelfile " ); // 获得文件: File toFile = new File( " c:\\学生信息临时文件.xls " ); // 产生文件名和空文件 file.transferTo(toFile); // 文件上传 Workbook book = Workbook.getWorkbook(toFile); // 得到工作薄 Sheet sheet = book.getSheet( 0 ); // 获得第一个工作表对象 int row = sheet.getRows(); // /得到该 sheet 的行数 int column = sheet.getColumns(); // 得到该 sheet 的列数 System.out.println( " 数据行数= " + row); System.out.println( " 数据列数= " + column); for ( int i = 1 ;i < row;i ++ ) { for ( int j = 0 ;j < column;j ++ ) { System.out.println( " j= " + j); sheet.getCell(j, i).getContents(); // 得到第 j 列第 i 行的单元格的类容 student_info.setStudentID(sheet.getCell(j, i).getContents()); } if ( this .studentManage.getStudentByStudentID( student_info.getStudentID()).size() != 0 ) return new ModelAndView( " education/e-studentInfoAddError " ); this .studentManage.insertStudent_info(student_info); } book.close(); return new ModelAndView( " education/e-studentInfoAddExcelSuccess " , " row " , new Integer(row - 1 )); } catch (Exception e) { e.printStackTrace(); } return new ModelAndView( " education/e-studentInfoAddExcelError " ); } public void setStudentManage(IStudent_infoManage studentManage) { this .studentManage = studentManage; } } 用 Java 读取 Excel 表数据和将数据导出成 Excel 表 最近的项目需要使用大量的 Excel 表,策划把数据都做成 Excel 表,通过编辑器把 Excel 表的数据导 入到数据库,编辑器提供各种编辑操作,还要提供将数据库导出成Excel表的功能。借助于Java Excel API, 这个问题就很简单了。 一:史上最简单的方法 对于简单的表格(纯文本),其实可以不借助 Java Excel API 而有更简单的方法!用制表符/t 隔开每 个域,用换行符/n 隔开每一行,将文件后缀名改为".xls"搞定!只是这样弄出来的 Excel 表无法指定格式 (如颜色,边框,对齐方式等等)。 二:Java Excel API Java Excel 是一个开源项目,通过它 Java 开发人员可以读取 Excel 文件的内容、创建新的 Excel 文 件、更新已经存在的 Excel 文件等,在项目中需要导入名为 jxl.jar 的包。在这里只是示例它的基本用法, 其他高级的功能(图片、公式、格式等)请参考 Java Excel 的帮助文档,这里是关于它的资料: http://jexcelapi.sourceforge.net/。 如有一个用户资料的 Excel 表,包含 ID、用户名、性别、邮件等信息,定义一个用户 JavaBean: package com.monitor1394.excel; /** * 用户 * @author monitor * Created on 2010-12-22, 9:57:58 */ public class User { /** ID */ private int id; /** 用户名 */ private String name; /** 性别 1:男 2:女*/ private int sex; /** 邮件 */ private String email; public User(){ } public User(int id,String name,int sex,String email){ this.id=id; this.name=name; this.sex=sex; this.email=email; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getSex() { return sex; } public void setSex(int sex) { this.sex = sex; } @Override public String toString(){ return id+":"+name; } } package com.monitor1394.excel; /** * 用户 * @author monitor * Created on 2010-12-22, 9:57:58 */ public class User { /** ID */ private int id; /** 用户名 */ private String name; /** 性别 1:男 2:女*/ private int sex; /** 邮件 */ private String email; public User(){ 提供的 Excel 表操作类如下,某些单元格的格式可按自己意愿指定: package com.monitor1394.excel; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; 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.Number; import jxl.write.NumberFormats; import jxl.write.WritableCellFormat; import jxl.write.WritableFont; import jxl.write.WritableSheet; import jxl.write.WritableWorkbook; import jxl.write.WriteException; /** * * Excel 表操作 * * @author monitor * Created on 2010-12-22, 9:50:28 */ public class Excel { /** 标题单元格格式 */ private static WritableCellFormat titleFormat=null; /** 主题内容单元格格式 */ private static WritableCellFormat bodyFormat=null; /** 注释单元格格式 */ private static WritableCellFormat noteFormat=null; /** 浮点型数据的单元格格式 */ private static WritableCellFormat floatFormat=null; /** 整型数据的单元格格式 */ private static WritableCellFormat intFormat=null; /** 初始化数据 */ private static boolean init=false; /** 私有构造方法,防止错误使用 Excel 类 */ private Excel(){ } /** * 初始化各单元格格式 * @throws WriteException 初始化失败 */ private static void init() throws WriteException{ WritableFont font1,font2,font3,font4; //Arial 字体,9 号,粗体,单元格黄色,田字边框,居中对齐 font1 = new WritableFont(WritableFont.ARIAL, 9, WritableFont.BOLD, false); titleFormat = new WritableCellFormat (font1); titleFormat.setBackground(Colour.YELLOW); titleFormat.setBorder(Border.ALL, BorderLineStyle.THIN); titleFormat.setAlignment(Alignment.CENTRE); //Arial 字体,9 号,粗体,单元格黄色,田字边框,左右居中对齐,垂直居中对齐,自动换行 font2 = new WritableFont(WritableFont.ARIAL, 9, WritableFont.BOLD, false); noteFormat = new WritableCellFormat (font2); noteFormat.setBackground(Colour.YELLOW); noteFormat.setBorder(Border.ALL, BorderLineStyle.THIN); noteFormat.setAlignment(Alignment.CENTRE); noteFormat.setVerticalAlignment(VerticalAlignment.CENTRE); noteFormat.setWrap(true); //Arial 字体,9 号,非粗体,单元格淡绿色,田字边框 font3 = new WritableFont(WritableFont.ARIAL, 9, WritableFont.NO_BOLD, false); bodyFormat = new WritableCellFormat (font3); bodyFormat.setBackground(Colour.LIGHT_GREEN); bodyFormat.setBorder(Border.ALL, BorderLineStyle.THIN); //Arial 字体,9 号,非粗体,单元格淡绿色,田字边框 font4 = new WritableFont(WritableFont.ARIAL, 9, WritableFont.NO_BOLD, false); floatFormat = new WritableCellFormat (font4,NumberFormats.FLOAT); floatFormat.setBackground(Colour.LIGHT_GREEN); floatFormat.setBorder(Border.ALL, BorderLineStyle.THIN); //Arial 字体,9 号,非粗体,单元格淡绿色,田字边框 font4 = new WritableFont(WritableFont.ARIAL, 9, WritableFont.NO_BOLD, false); intFormat = new WritableCellFormat (font4,NumberFormats.INTEGER); intFormat.setBackground(Colour.LIGHT_GREEN); intFormat.setBorder(Border.ALL, BorderLineStyle.THIN); init=true; } public static void createUserExcelFile(List userList,File destFile) throws WriteException, IOException{ if(init==false) init(); int index,row; WritableSheet sheet=null; WritableWorkbook book=null; book = Workbook.createWorkbook(destFile); sheet = book.createSheet("用户表", 0); sheet.setColumnView(0, 15); sheet.setColumnView(1, 15); sheet.setColumnView(2, 15); sheet.setColumnView(3, 40); //字段变量名 index=0; sheet.addCell(new Label(index++,0,"id",titleFormat)); sheet.addCell(new Label(index++,0,"name",titleFormat)); sheet.addCell(new Label(index++,0,"sex",titleFormat)); sheet.addCell(new Label(index++,0,"email",titleFormat)); //字段名 index=0; sheet.addCell(new Label(index++,1,"ID",titleFormat)); sheet.addCell(new Label(index++,1,"用户名",titleFormat)); sheet.addCell(new Label(index++,1,"性别",titleFormat)); sheet.addCell(new Label(index++,1,"邮件",titleFormat)); //字段注释 index=0; sheet.addCell(new Label(index++,2,null,noteFormat)); sheet.addCell(new Label(index++,2,null,noteFormat)); sheet.addCell(new Label(index++,2,"1:男/n2:女",noteFormat)); sheet.addCell(new Label(index++,2,null,noteFormat)); row=3; for(User user:userList){ if(user==null) continue; index=0; sheet.addCell(new Number(index++,row,user.getId(),bodyFormat)); sheet.addCell(new Label(index++,row,user.getName(),bodyFormat)); sheet.addCell(new Number(index++,row,user.getSex(),bodyFormat)); sheet.addCell(new Label(index++,row,user.getEmail(),bodyFormat)); row++; } book.write(); if(book!=null) book.close(); } public static List readUserExcelFile(File file) throws IOException, BiffException{ if(file==null) return null; int row,column; String temp=null; Workbook book =null; Sheet sheet=null; List userList=new ArrayList(); book = Workbook.getWorkbook(file); sheet = book.getSheet(0); row=3; while(row readDataFromExcel(File inputFile, int inputFileSheetIndex){ ArrayList list = new ArrayList(); Workbook book = null; Cell cell = null; WorkbookSettings setting = new WorkbookSettings(); java.util.Locale locale = new java.util.Locale("zh","CN"); //本地 setting.setLocale(locale); setting.setEncoding("ISO-8859-1"); //设置字符集编码 try{ book = Workbook.getWorkbook(inputFile, setting); }catch(Exception e){ e.printStackTrace(); } Sheet sheet = book.getSheet(inputFileSheetIndex); for (int rowIndex = 0; rowIndex < sheet.getRows(); rowIndex++) {//行 for (int colIndex = 0; colIndex < sheet.getColumns(); colIndex++) {//列 cell = sheet.getCell(colIndex, rowIndex); list.add(cell.getContents()); } } book.close(); return list; } /** * 得到数据表头格式 * @return */ public WritableCellFormat getTitleCellFormat(){ WritableCellFormat wcf = null; try { // 字体样式(字体,大小,是否粗体,是否斜体) WritableFont wf = new WritableFont(WritableFont.TIMES,11, WritableFont.BOLD,false); wcf = new WritableCellFormat(wf);//实例化文字格式化 // 对齐方式 wcf.setAlignment(Alignment.LEFT); //水平 wcf.setVerticalAlignment(VerticalAlignment.CENTRE); //垂直 } catch (WriteException e) { e.printStackTrace(); } return wcf; } /** * 得到数据格式(默认左对齐) * @return */ public WritableCellFormat getDataCellFormat(CellType type){ WritableCellFormat wcf = null; try { // 字体样式 if(type == CellType.NUMBER || type == CellType.NUMBER_FORMULA){//数字 NumberFormat nf = new NumberFormat("#.00"); //保留小数点后两位 wcf = new WritableCellFormat(nf); }else if(type == CellType.DATE || type == CellType.DATE_FORMULA){//日期 jxl.write.DateFormat df = new jxl.write.DateFormat("yyyy-MM-dd hh:mm:ss"); //时间显示格式 wcf = new jxl.write.WritableCellFormat(df); }else{ WritableFont wf = new WritableFont(WritableFont.TIMES,11, WritableFont.NO_BOLD,false);// 字体样式(字体,大小,是否粗体,是否斜体) wcf = new WritableCellFormat(wf); } // 对齐方式 wcf.setAlignment(Alignment.LEFT); wcf.setVerticalAlignment(VerticalAlignment.CENTRE); wcf.setWrap(false);//自动换行 } catch (WriteException e) { e.printStackTrace(); } return wcf; } /** * 得到数据格式(重载) * @return */ public WritableCellFormat getDataCellFormat(CellType type,Alignment align){ WritableCellFormat wcf = null; try { // 字体样式 if(type == CellType.NUMBER || type == CellType.NUMBER_FORMULA){//数字 NumberFormat nf = new NumberFormat("#.00"); //保留小数点后两位 wcf = new WritableCellFormat(nf); }else if(type == CellType.DATE || type == CellType.DATE_FORMULA){//日期 jxl.write.DateFormat df = new jxl.write.DateFormat("yyyy-MM-dd hh:mm:ss"); //时间显示格式 wcf = new jxl.write.WritableCellFormat(df); }else{ WritableFont wf = new WritableFont(WritableFont.TIMES,12, WritableFont.NO_BOLD,false);// 字体样式(字体,大小,是否粗体,是否斜体) wcf = new WritableCellFormat(wf); } // 对齐方式 wcf.setAlignment(align); wcf.setVerticalAlignment(VerticalAlignment.CENTRE); wcf.setWrap(true);//自动换行 } catch (WriteException e) { e.printStackTrace(); } return wcf; } /** * 创建目录 * @param destDirName 目录路径 */ public static void createDir(String destDirName) { File dir = new File(destDirName); //如果目录不存在则创建目录 if(!dir.exists()) { if(!destDirName.endsWith(File.separator)) destDirName = destDirName + File.separator; // 创建单个目录 if(dir.mkdirs()) { System.out.println("创建目录" + destDirName + "成功!"); } else { System.out.println("创建目录" + destDirName + "成功!"); } } } /** * 生成并关闭工作簿 */ public void writeAndClose(){ try { workbook.write(); workbook.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (WriteException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 生成 Excel 文件(适合一个标题,剩余全是数据) * @param path 文件路径 * @param sheetName 工作表名称 * @param dataTitles 数据标题 */ public void createExcelFile(String path,String sheetName,List dataTitles,List datas){ try{ OutputStream os=new FileOutputStream(path);//输出流指定文件路径 workbook=Workbook.createWorkbook(os);//创建工作薄 sheet = workbook.createSheet(sheetName, 0); //添加第一个工作表 initialSheetSetting(sheet);//初始化表格属性(公共方法) // 添加数据标题 insertRowData(sheet,0,dataTitles,getTitleCellFormat()); // 插入一行 (公共方法) for(int i=0;i(); list.add("200201001"); list.add("张 三"); list.add("100"); list.add("60"); list.add("100"); list.add("260"); datas.add(list); } //创建 Excel 表格 jxl.createExcelFile(filePath,"成绩单",titles,datas); */ } } Excel 效果图: JXL 核心组件中存在两个致命的性能问题: 1.1. 使用 JXL 不可避免地会遇到大对象请求的现象。 jxl.write.biff.File 和 jxl.read.biff.File 构造方法中缺省创建的 5 兆大小原始类型数组,并不是业务场景运行 必须,我们应该可以使此原始类型数组缺省大小减小,从而减小对 JVM 内存管理的压力,提高系统的稳 定性。进一步分析 jxl.write.biff.File 和 jxl.read.biff.File 源代码: package jxl.write.biff; … public final class File { File(OutputStream os, WorkbookSettings ws) { initialFileSize = ws.getInitialFileSize(); arrayGrowSize = ws.getArrayGrowSize(); data = new byte[initialFileSize]; pos = 0; outputStream = os; workbookSettings = ws; } … } package jxl.read.biff; … public final class File { File(InputputStream is, WorkbookSettings ws) { workbookSettings = ws; initialFileSize = workbookSettings.getInitialFileSize(); arrayGrowSize = workbookSettings.getArrayGrowSize(); byte d[] = new byte[initialFileSize]; int bytesRead = is.read(d); int pos = bytesRead; } … } package jxl.write.biff; … public final class File 正如我们初期判断,在 File 构造方法中,创建数组大小为 initialFileSize 的 byte[]数组,而 initialFileSize 由 jxl. WorkbookSettings 类对象中定义,如以下代码: package jxl; …… public final class WorkbookSettings { private int initialFileSize; private int arrayGrowSize; private boolean gcDisabled; …… public WorkbookSettings() { initialFileSize = 5242880; arrayGrowSize = 1048576; localeFunctionNames = new HashMap(); …… gcDisabled = Boolean.getBoolean(”jxl.nogc”); …… } public void setArrayGrowSize(int sz) { arrayGrowSize = sz; } public int getArrayGrowSize() { return arrayGrowSize; } public void setInitialFileSize(int sz) { initialFileSize = sz; } public int getInitialFileSize() { return initialFileSize; } public boolean getGCDisabled() { return gcDisabled; } …… } package jxl; …… public final class WorkbookSetti 其中定义的系统缺省 initialFileSize 大小为 5242880,而单个 byte 大小为一个字节,从此我们可以断定 在 jxl.write.biff.File 和 jxl.read.biff.File 构造方法中会缺省创建了一个 5兆大小的大对象 byte[5242880] 1.2. JXL 核心代码中过度使用 System.gc()方法,增加 CPU 负荷。在 jxl.write.biff.File 类对象方法 colse 和 WorkbookParser 类对象方法 close 中,对系统 JVM 垃圾回收进行了强制垃圾回收,在 J2EE 应用服 务器中,我们是极力反对这种应用调度 GC 的做法,此种操作会极度影响系统性能和稳定性。 package jxl.write.biff; ….. public final class File { …… void close(boolean cs) throws IOException { …… if(!workbookSettings.getGCDisabled()) System.gc(); } …… } package jxl.read.biff; ….. public final class WorkbookParser { …… public void close() { if (lastSheet != null) lastSheet.clear(); excelFile.clear(); if (!settings.getGCDisabled()) System.gc(); } …… } package jxl.write.biff; ….. public final class Fil 2. 针对 Excel 生成组件 JXL 大对象和 System.gc 问题的修订在 jxl.WorkbookSettings 类中进行如 下代码修订 package jxl; …… public final class WorkbookSettings { public WorkbookSettings() { //initialFileSize = 5242880; initialFileSize = 204800; //初始化 Excel 创建对象数组为 200K //arrayGrowSize = 1048576; arrayGrowSize = 204800; //对象数组不够用时,数组大小增长 200K localeFunctionNames = new HashMap(); try { boolean suppressWarnings = Boolean.getBoolean(”jxl.nowarnings”); setSuppressWarnings(suppressWarnings); drawingsDisabled = Boolean.getBoolean(”jxl.nodrawings”); namesDisabled = Boolean.getBoolean(”jxl.nonames”); //gcDisabled = Boolean.getBoolean(“jxl.nogc”); gcDisabled = true; //设置不允许进行任何应用层调度 JVM 进行垃圾回收 rationalizationDisabled = Boolean.getBoolean(”jxl.norat”); …… } } …… } package jxl; …… public final class WorkbookSetti 3. 小结 通过代码的修订从而避免了系统内存中频繁出现大对象和应用层频繁调用 JVM 垃圾回收 的现象,最终提高了系统的稳定性。 也可以通过, WorkbookSettings ws = new WorkbookSettings(); ws.setInitialFileSize(200*1024); ws.setGCDisabled(true); ws.setArrayGrowSize(512*1024); book = Workbook.getWorkbook(file,ws); 来进行设置 JXL,POI 解析 Excel package excel; import java.io.FileOutputStream; import java.io.OutputStream; import java.text.SimpleDateFormat; import java.util.Date; import jxl.Workbook; import jxl.format.Alignment; import jxl.format.Border; import jxl.format.BorderLineStyle; 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 jxlCreate { /** * @param args */ public static void main(String[] args) { // 准备设置 excel 工作表的标题 String[] title = {"编号","产品名称","产品价格","产品数量","生产日期","产地","是否出口"}; try { // 获得开始时间 long start = System.currentTimeMillis(); // 输出的 excel 的路径 String filePath = "c:\\test.xls"; // 创建 Excel 工作薄 WritableWorkbook wwb; // 新建立一个 jxl 文件,即在 C 盘下生成 test.xls OutputStream os = new FileOutputStream(filePath); wwb=Workbook.createWorkbook(os); // 添加第一个工作表并设置第一个 Sheet 的名字 WritableSheet sheet = wwb.createSheet("产品清单", 0); Label label; for(int i=0;iC2 sheet.mergeCells(0, 0, 2, 1); Label titleCell = new Label(0, 0, "Title Cell ", wcfTitle); sheet.addCell(titleCell); WritableFont wf = new WritableFont(WritableFont.ARIAL, 10, WritableFont.NO_BOLD, false, UnderlineStyle.NO_UNDERLINE, Colour.BLUE); WritableCellFormat wcf = new WritableCellFormat(wf); // A3 Label labelCell = new Label(0, 2, "Label Cell "); sheet.addCell(labelCell); // B3 Label labelCellFmt = new Label(1, 2, "Label Cell with WritableCellFormat ", wcf); sheet.addCell(labelCellFmt); // A4 添加 jxl.write.Number 对象 jxl.write.Number labelN = new jxl.write.Number(0, 3, 3.1415926); sheet.addCell(labelN); // B4 添加 Number 对象 jxl.write.NumberFormat NumberFormat nf = new NumberFormat("#.##"); WritableCellFormat wcfN = new WritableCellFormat(nf); jxl.write.Number labelNF = new jxl.write.Number(1, 3, 3.1415926, wcfN); sheet.addCell(labelNF); // A5 添加 jxl.write.Boolean 对象 jxl.write.Boolean labelB = new jxl.write.Boolean(0, 4, true); sheet.addCell(labelB); // A6 添加 jxl.write.DateTime 对象 jxl.write.DateTime labelDT = new jxl.write.DateTime(0, 5, new Date()); sheet.addCell(labelDT); // B6 添加 DateTime 对象 jxl.write.DateFormat jxl.write.DateFormat df = new jxl.write.DateFormat( "yyyy-MM-dd HH:mm:ss"); WritableCellFormat wcfDF = new WritableCellFormat(df); jxl.write.DateTime labelDTF = new jxl.write.DateTime(1, 5, new Date(), wcfDF); sheet.addCell(labelDTF); //先调用 write();再调用 close(); wwb.write(); wwb.close(); os.close(); } catch (Exception e) { e.printStackTrace(); } finally { if (null != os) { os.close(); } } } /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { String filePath = "D:\\test\\testjxlwrite.xls"; JxlWrite jxlwrite = new JxlWrite(); jxlwrite.writeExcel(filePath); } } 运行结果: ps:添加 DateTime 对象时 如果没有加格式时,出现 1900/1/0 不知啥原因? 三、插入图片 /** * jxl 插入图片(图像格式只支持 png) * @author Michael sun */ public class JxlWriteImg { /** * * @param filePath */ private void writeImg(String filePath) throws Exception { OutputStream os = null; try { String imgPath = "d:\\test\\xx.png"; os = new FileOutputStream(filePath); WritableWorkbook wwb = Workbook.createWorkbook(os); WritableSheet ws = wwb.createSheet("write img", 0); File imgFile = new File(imgPath); // WritableImage(col, row, width, height, imgFile); WritableImage image = new WritableImage(2, 1, 8, 20, imgFile); ws.addImage(image); wwb.write(); wwb.close(); } catch (Exception e) { System.out.println(e); } finally { if (null != os) { os.close(); } } } /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { String filePath = "D:\\test\\testjxlwriteimg.xls"; JxlWriteImg jxlWriteImg = new JxlWriteImg(); jxlWriteImg.writeImg(filePath); } } 运行结果: 四、更新 Excel /** * jxl 更新 excel * @author Michael sun */ public class JxlUpdate { /** * * @param filePath */ private void doUpdate(String filePath) { try { // 获得原 Excel 文件 Workbook wb = Workbook.getWorkbook(new File(filePath)); // 打开一个文件的副本,并且指定数据写回到原文件 WritableWorkbook wwb = Workbook.createWorkbook(new File(filePath), wb); // 对第一个工作簿的 A1 更新 WritableSheet wsheet0 = wwb.getSheet(0); WritableCell wc00 = wsheet0.getWritableCell(0, 0); if (wc00.getType() == CellType.LABEL) { Label label00 = (Label) wc00; label00.setString("updata data"); } // 添加一个工作表 WritableSheet sheet = wwb.createSheet("新增工作簿", 1); // 写入一些测试数据 sheet.addCell(new Label(0, 0, "test data")); // 关闭工作薄对象 wwb.write(); wwb.close(); wb.close(); } catch (Exception e) { System.out.println(e); } } /** * @param args */ public static void main(String[] args) { String filePath = "D:\\test\\testjxlupdate.xls"; JxlUpdate jxlUpdate = new JxlUpdate(); jxlUpdate.doUpdate(filePath); } } jxl 操作 excel(合并单元格,设置背景色,字体颜色) Excel 单元测试 OSJ#F# 现在正在做的项目中涉及大量的 Excel 文件导出导入操作,都是使用 Java Excel 来操作。 Java Excel 是一开放源码项目,通过它 Java 开发人员可以读取 Excel 文件的内容、创建新的 Excel 文件、更新已经存在的 Excel 文件。下面我写了一个简单的例子,展示基本的读取,新建,更新(包 括常见格式的设置:字体,颜色,背景,合并单元格),拷贝操作,有这些其实已经基本足够应付大部分 问题了。下面是例的源代码: import java.io.*; import java.util.Date; import jxl.*; import jxl.format.Colour; import jxl.format.UnderlineStyle; import jxl.read.biff.BiffException; import jxl.write.*; import jxl.format.UnderlineStyle; import jxl.format.CellFormat;; public class OperateExcel { /** * Read data from a excel file */ public static void readExcel(String excelFileName){ Workbook rwb = null; try{ InputStream stream = new FileInputStream(excelFileName); rwb = Workbook.getWorkbook(stream); Sheet sheet = rwb.getSheet(0); Cell cell = null; int columns = sheet.getColumns(); int rows = sheet.getRows(); for( int i=0 ; i< rows ; i++ ) for( int j=0 ; j< columns ; j++){ //attention: The first parameter is column,the second parameter is row. cell = sheet.getCell(j,i); String str00 = cell.getContents(); if( cell.getType() == CellType.LABEL ) str00 += " LAEBL"; else if( cell.getType() == CellType.NUMBER) str00 += " number"; else if( cell.getType() == CellType.DATE) str00 += " date"; System.out.println("00==>"+str00); } stream.close(); } catch(IOException e){ e.printStackTrace(); } catch(BiffException e){ e.printStackTrace(); } finally{ rwb.close(); } } /** * create a new excelFile * @param excelFileName create name */ public static void createExcelFile(String excelFileName){ try{ WritableWorkbook wwb = Workbook.createWorkbook(new File(excelFileName)); WritableSheet ws = wwb.createSheet("sheet1",0); //also,The first parameter is column,the second parameter is row. // add normal label data Label label00 = new Label(0,0,"Label00"); ws.addCell(label00); //add font formating data WritableFont wf = new WritableFont(WritableFont.TIMES, 18, WritableFont.BOLD , true); WritableCellFormat wff = new WritableCellFormat(wf); Label label10 = new Label(1,0,"Label10",wff); ws.addCell(label10); //add color font formating data WritableFont wf_color = new WritableFont(WritableFont.ARIAL,10,WritableFont.NO_BOLD,false,UnderlineStyle.DOUBLE_ACC OUNTING,Colour.RED); WritableCellFormat wff_color = new WritableCellFormat(wf_color); wff_color.setBackground(Colour.GRAY_25); //set background coloe to gray Label label20 = new Label(2,0,"Label20",wff_color); ws.addCell(label20); //合并单元格 WritableFont wf_merge = new WritableFont(WritableFont.ARIAL,10,WritableFont.NO_BOLD,false,UnderlineStyle.DOUBLE_ACC OUNTING,Colour.GREEN); WritableCellFormat wff_merge = new WritableCellFormat(wf_merge); wff_merge.setBackground(Colour.BLACK); Label label30 = new Label(3,0,"Label30",wff_merge); ws.addCell(label30); Label label40 = new Label(4,0,"Label40"); ws.addCell(label40); Label label50 = new Label(5,0,"Label50"); ws.addCell(label50); //合并 (0,3) (4,0) //attention : 如果合并后面的列不为空,那么就把后面格的内容清空,格式也是按前一个单元格的格 式 ws.mergeCells(3,0,4,0); //添加 Number 格式数据 jxl.write.Number labelN = new jxl.write.Number(0, 1, 3.1415926); ws.addCell(labelN); //添加带有 formatting 的 Number 对象 jxl.write.NumberFormat nf = new jxl.write.NumberFormat("#.##"); jxl.write.WritableCellFormat wcfN = new jxl.write.WritableCellFormat(nf); jxl.write.Number labelNF = new jxl.write.Number(1, 1, 3.1415926, wcfN); ws.addCell(labelNF); //添加 Boolean 对象 jxl.write.Boolean labelBoolean = new jxl.write.Boolean(2,1,false); ws.addCell(labelBoolean); //添加 DateTime 对象 DateTime labelDT = new DateTime(3,1,new Date()); ws.addCell(labelDT); //添加带有格式的 DataTime 数据 DateFormat dtf = new DateFormat("yyyy-MM-dd hh:mm:ss"); WritableCellFormat wcfDt = new WritableCellFormat(dtf); wcfDt.setBackground(Colour.YELLOW); DateTime labelDT_format = new DateTime(4,1,new java.util.Date(),wcfDt); ws.addCell(labelDT_format); ws.mergeCells(4,1,5,1); //比较长,用两列来显示 wwb.write(); wwb.close(); } catch(IOException e){ e.printStackTrace(); } catch(WriteException e){ e.printStackTrace(); } } /** * 如何更新 Excel 文件 * @param fileName */ public static void updateExcel(String fileName){ try{ jxl.Workbook rw = jxl.Workbook.getWorkbook(new File(fileName)); WritableWorkbook wwb = Workbook.createWorkbook(new File(fileName),rw); //这里其实执行的是一次 copy 操作,把文件先读到内存中,修改后再保存覆盖原来的文件来实现 update 操作 WritableSheet ws = wwb.getSheet(0); WritableCell wc = ws.getWritableCell(0,0); if( wc.getType() == CellType.LABEL){ Label l = (Label)wc; l.setString(wc.getContents()+"_new"); } wwb.write(); wwb.close(); } catch(IOException e){ e.printStackTrace(); } catch(WriteException e){ e.printStackTrace(); } catch(BiffException e){ e.printStackTrace(); } } /** * 如何 copy Excel 文件 * @param fileName */ public static void copyExcel(String sourFileName,String destFileName){ try{ jxl.Workbook rw = jxl.Workbook.getWorkbook(new File(sourFileName)); WritableWorkbook wwb = Workbook.createWorkbook(new File(destFileName),rw); wwb.write(); wwb.close(); } catch(IOException e){ e.printStackTrace(); } catch(WriteException e){ e.printStackTrace(); } catch(BiffException e){ e.printStackTrace(); } } public static void main(String [] argv){ //OperateExcel.readExcel("E:\\test.xls"); //OperateExcel.createExcelFile("E:\\test1.xls"); //OperateExcel.updateExcel("E:\\test.xls"); OperateExcel.copyExcel("E:\\test.xls","E:\\moon.xls"); } } jxl 读写 excel 常见操作搜集整理(转载) (2008-10-29 22:53:01) 标签:jxl excel 杂谈 分类:java jxl 读写 excel 常见操作搜集整理 2008-04-23 17:26 package common.excelTool; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import jxl.Cell; import jxl.CellType; import jxl.DateCell; import jxl.Range; import jxl.Sheet; import jxl.Workbook; import jxl.WorkbookSettings; import jxl.format.Alignment; import jxl.format.Border; import jxl.format.BorderLineStyle; import jxl.format.CellFormat; import jxl.format.Colour; import jxl.format.UnderlineStyle; import jxl.format.VerticalAlignment; import jxl.write.Formula; import jxl.write.Label; import jxl.write.Number; import jxl.write.NumberFormat; import jxl.write.WritableCell; import jxl.write.WritableCellFeatures; 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 WriteExcelTest { static HashMap map = new HashMap(); public static void main(String[] args) { try { // copyDateFormat(new File("c:\\a.xls"), 0, "c:\\copy of a.xls"); // writeExcelUseFormat("c:\\format.xls","test"); // buildNewFormTemplete(new File("c:/templete.xls"),new File( "c:/buildNewFormTemplete.xls")); // modifyDirectly1(new File("c:/templete.xls")); // modifyDirectly2(new File("c:/templete.xls")); copyDateAndFormat(new File("c:/a.xls"), 0, "c:/a2.xls"); } catch (Exception e) { // TODO 自动生成 catch 块 e.printStackTrace(); } } public static void modifyDirectly2(File inputFile) throws Exception{ Workbook w1 = Workbook.getWorkbook(inputFile); WritableWorkbook w2 = Workbook.createWorkbook(inputFile, w1); WritableSheet sheet = w2.getSheet(0); WritableCell cell = null; CellFormat cf = null; //加粗 cell = sheet.getWritableCell(0,0); WritableFont bold = new WritableFont(WritableFont.ARIAL, WritableFont.DEFAULT_POINT_SIZE, WritableFont.BOLD); cf = new WritableCellFormat(bold); cell.setCellFormat(cf); //设置下划线 cell = sheet.getWritableCell(0,1); WritableFont underline = new WritableFont(WritableFont.ARIAL, WritableFont.DEFAULT_POINT_SIZE, WritableFont.NO_BOLD, false, UnderlineStyle.SINGLE); cf = new WritableCellFormat(underline); cell.setCellFormat(cf); //直截添加可以覆盖掉 setCellValueDirectly(sheet,sheet.getCell(0, 2),new Double(4),CellType.NUMBER); w2.write(); w2.close(); } public static void modifyDirectly1(File file) { try{ // Excel 获得文件 Workbook wb = Workbook.getWorkbook(file); // 打开一个文件的副本,并且指定数据写回到原文件 WritableWorkbook book = Workbook.createWorkbook(file, wb); WritableSheet sheet0 = book.getSheet(0); sheet0.addCell(new Label(0, 1, "陈小稳")); // 添加一个工作表 WritableSheet sheet = book.createSheet( " 第二页 " , 1 ); sheet.addCell( new Label( 0 , 0 , " 第二页的测试数据 " )); book.write(); book.close(); } catch (Exception e) { System.out.println(e); } } public static void buildNewFormTemplete(File inputFile, File outputFile){ try{ // Excel 获得文件 Workbook wb = Workbook.getWorkbook(inputFile); // 打开一个文件的副本,并且指定数据写回到原文件 WritableWorkbook book = Workbook.createWorkbook(outputFile, wb); WritableSheet sheet0 = book.getSheet(0); sheet0.addCell(new Label(0, 1, "陈小稳")); // 添加一个工作表 WritableSheet sheet = book.createSheet( " 第二页 " , 1 ); sheet.addCell( new Label( 0 , 0 , " 第二页的测试数据 " )); book.write(); book.close(); } catch (Exception e) { System.out.println(e); } } public static void copyDateAndFormat(File inputFile, int inputFileSheetIndex, String outputFilePath) throws Exception { Workbook book = null; Cell cell = null; //1.避免乱码的设置 WorkbookSettings setting = new WorkbookSettings(); java.util.Locale locale = new java.util.Locale("zh","CN"); setting.setLocale(locale); setting.setEncoding("ISO-8859-1"); book = Workbook.getWorkbook(inputFile, setting); Sheet readonlySheet = book.getSheet(inputFileSheetIndex); OutputStream os=new FileOutputStream(outputFilePath);//输出的 Excel 文件 URL WritableWorkbook wwb = Workbook.createWorkbook(os);//创建可写工作薄 WritableSheet writableSheet = wwb.createSheet(readonlySheet.getName(), 0);//创建可写工作表 //2.誊写不同数据格式的数据 for (int rowIndex = 0; rowIndex < readonlySheet.getRows(); rowIndex++) { for (int colIndex = 0; colIndex < readonlySheet.getColumns(); colIndex++) { cell = readonlySheet.getCell(colIndex, rowIndex); //A2B2 为合并的单元格,A2 有内容,B2 为空 // if(colIndex == 0 && rowIndex == 1){ // System.out.println(colIndex + "," + rowIndex + " type:" + cell.getType() +" :" + cell.getContents()); // } //【有各种设置格式】 if(cell.getType() == CellType.DATE || cell.getType() == CellType.DATE_FORMULA){ writableSheet.addCell( new jxl.write.DateTime( colIndex , rowIndex , ((DateCell)cell).getDate(), new jxl.write.WritableCellFormat( cell.getCellFormat() ) ) ); }else if(cell.getType() == CellType.NUMBER || cell.getType() == CellType.NUMBER_FORMULA){ writableSheet.addCell( new jxl.write.Number( colIndex , rowIndex , ((jxl.NumberCell)cell).getValue(), new jxl.write.WritableCellFormat( cell.getCellFormat() ) ) ); }else if(cell.getType() == CellType.EMPTY){ //空的以及合并单元格中第一列外的 // System.out.println("EMPTY:"+cell.getContents()); // System.err.println("空单元格 at " + colIndex + "," + rowIndex +" content:" + cell.getContents()); }else if(cell.getType() == CellType.LABEL || cell.getType() == CellType.STRING_FORMULA){ writableSheet.addCell( new Label( colIndex , rowIndex , cell.getContents() , new jxl.write.WritableCellFormat( cell.getCellFormat() ) ) ); }else{ System.err.println("其它单元格类型:" + cell.getType() + " at " + colIndex + "," + rowIndex +" content:" + cell.getContents()); } // if(cell.getType() == CellType.STRING_FORMULA){ // System.err.println(colIndex + "," + rowIndex +":" + cell.getContents() +" type:" + cell.getType()); // } } } //3.处理合并单元格的事情(复制合并单元格格式) Range[] range = readonlySheet.getMergedCells(); for (int i = 0; i < range.length; i++) { // System.out.println("第"+i+"处合并的单元格:" // +",getTopLeft="+range[i].getTopLeft().getColumn() // +","+range[i].getTopLeft().getRow() // +",getBottomRight="+range[i].getBottomRight().getColumn() // +","+range[i].getBottomRight().getRow() // ); //topleftXIndex, topleftYIndex, bottomRightXIndex, bottomRightYIndex writableSheet.mergeCells( range[i].getTopLeft().getColumn(), range[i].getTopLeft().getRow(), range[i].getBottomRight().getColumn(), range[i].getBottomRight().getRow() ); } //4.设置行列高宽 for (int colIndex = 0; colIndex < readonlySheet.getColumns(); colIndex++) { writableSheet.setColumnView(colIndex,readonlySheet.getColumnView(colIndex)); } for (int rowIndex = 0; rowIndex < readonlySheet.getRows(); rowIndex++) { writableSheet.setRowView(rowIndex,readonlySheet.getRowView(rowIndex)); } wwb.write(); wwb.close(); os.close(); } public static void writeExcelUseFormat(String outputFilePath,String outputFileSheetName) throws Exception{ OutputStream os=new FileOutputStream(outputFilePath);//输出的 Excel 文件 URL WritableWorkbook wwb = Workbook.createWorkbook(os);//创建可写工作薄 WritableSheet sheet = wwb.createSheet(outputFileSheetName, 0);//创建可写工作表 sheet.addCell(new Label(0, 0, "号码")); sheet.addCell(new Label(1, 0, "有效期")); //1.写入时间的数据格式 jxl.write.DateFormat df = new jxl.write.DateFormat("yyyy-MM-dd"); jxl.write.WritableCellFormat wcfDF = new jxl.write.WritableCellFormat(df); jxl.write.DateTime labelDTF = new jxl.write.DateTime(1, 1, new Date(), wcfDF); //自定义格式 sheet.addCell(labelDTF); //2.字体样式 // WritableFont()方法里参数说明: // 这个方法算是一个容器,可以放进去好多属性 // 第一个: TIMES 是字体大小,他写的是 18 // 第二个: BOLD 是判断是否为斜体,选择 true 时为斜体 // 第三个: ARIAL // 第四个: UnderlineStyle.NO_UNDERLINE 下划线 // 第五个: jxl.format.Colour.RED 字体颜色是红色的 jxl.write.WritableFont wf = new jxl.write.WritableFont(WritableFont.TIMES, 18, WritableFont.BOLD, true); jxl.write.WritableCellFormat wcfF = new jxl.write.WritableCellFormat(wf); wcfF.setWrap(true);//自动换行 wcfF.setAlignment(jxl.format.Alignment.CENTRE);//把水平对齐方式指定为居中 wcfF.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);//把垂直对齐方式指定为居中 jxl.write.Label labelC = new jxl.write.Label(0, 1, "This is a Label cell", wcfF); sheet.addCell(labelC); //3.添加带有 formatting 的 Number 对象 jxl.write.NumberFormat nf = new jxl.write.NumberFormat("#.##"); jxl.write.WritableCellFormat wcfN = new jxl.write.WritableCellFormat(nf); jxl.write.Number labelNF = new jxl.write.Number(0, 2, 3.1415926, wcfN); sheet.addCell(labelNF); //4.添加 Boolean 对象 jxl.write.Boolean labelB = new jxl.write.Boolean(0, 3, false); sheet.addCell(labelB); //5.设置一个注解 WritableCellFeatures cellFeatures = new WritableCellFeatures(); cellFeatures.setComment("添加 Boolean 对象"); labelB.setCellFeatures(cellFeatures); //6.单元格内换行 WritableCellFormat wrappedText = new WritableCellFormat (WritableWorkbook.ARIAL_10_PT); wrappedText.setWrap(true);//可换行的 label 样式 Label label = new Label(4, 0, "测试,\012 测试。。。",wrappedText); // "\012"强制换行 sheet.addCell(label); //7.数字的公式计算 Number n = new jxl.write.Number(0,9,4.5);//A10 sheet.addCell(n); n = new Number(1,9, ;//B10 sheet.addCell(n); NumberFormat dp3 = new NumberFormat("#.###"); //设置单元格里面的数字格式 WritableCellFormat dp3cell = new WritableCellFormat(dp3); dp3cell.setWrap(true); Formula f = new Formula(2, 9, "(a10+b10)/2", dp3cell); //设置 C10 公式 sheet.addCell(f); f = new Formula(3, 9, "SUM(A10:B10)", dp3cell);//设置 D10 公式 sheet.addCell(f); //8.设置 sheet 的样式 sheet.getSettings().setProtected(true); //设置 xls 的保护,单元格为只读的 sheet.getSettings().setPassword("123"); //设置 xls 的密码 sheet.getSettings().setDefaultColumnWidth(10); //设置列的默认宽度,2cm 左右 sheet.setRowView(3,200);//设置第 4 行高度 sheet.setRowView(2,false);// 这样可以自动把行高扩展 sheet.setColumnView(0 , 300);//设置第 1 列宽度,6cm 左右 sheet.mergeCells(0 , 5, 1, 7);//合并单元格:合并 A6B8 也就是 1 列 6 行 与 2 列 7 行 之间的矩形 //9.设置边框 drawRect(sheet, 5, 6, 7, 6,BorderLineStyle.THICK, Colour.BLACK, null); wwb.write(); wwb.close(); os.close(); } public static void drawRect(WritableSheet sheet, int x, int y, int width, int height,BorderLineStyle style,Colour BorderColor, Colour bgColor) throws WriteException { for(int w = 0; w < width; w++){ for(int h = 0; h < height; h ++) { WritableCellFormat alignStyle = new WritableCellFormat(); //单元格样式 alignStyle.setAlignment(Alignment.CENTRE); //设置对齐方式 alignStyle.setVerticalAlignment(VerticalAlignment.CENTRE);//设置对齐方式 if(h == 0)//画上 alignStyle.setBorder(Border.TOP, style, BorderColor);//设置边框的颜色和样式 if(w == 0)//画左 alignStyle.setBorder(Border.LEFT, style, BorderColor);//设置边框的颜色和样式 if(w == width - 1)//画右 alignStyle.setBorder(Border.RIGHT, style, BorderColor);//设置边框的颜色和样式 if(h == height -1)//画下 alignStyle.setBorder(Border.BOTTOM, style, BorderColor);//设置边框的颜色和样式 //drawLine(sheet, x, y, Border.BOTTOM); if(bgColor != null) alignStyle.setBackground(bgColor); //背静色 Label mergelabel = new Label(x, y, "", alignStyle); //topleftXIndex, topleftYIndex, bottomRightXIndex, bottomRightYIndex //sheet.mergeCells(2, 5, 10, 10); sheet.addCell(mergelabel); y++; } y -= height; x++; } } public static ArrayList sampleReadExcel(File inputFile, int inputFileSheetIndex) throws Exception { ArrayList list = new ArrayList(); Workbook book = null; Cell cell = null; //避免乱码的设置 WorkbookSettings setting = new WorkbookSettings(); java.util.Locale locale = new java.util.Locale("zh","CN"); setting.setLocale(locale); setting.setEncoding("ISO-8859-1"); book = Workbook.getWorkbook(inputFile, setting); Sheet sheet = book.getSheet(inputFileSheetIndex); for (int rowIndex = 0; rowIndex < sheet.getRows(); rowIndex++) {// Excel 第一行为表头,因此 J 初 值设为 1 for (int colIndex = 0; colIndex < sheet.getColumns(); colIndex++) {// 只需从 Excel 中取出 2 列 cell = sheet.getCell(colIndex, rowIndex); list.add(cell.getContents()); } } //【问题:如果在实际部署的时候没有写下面这句是否会导致不断消耗掉服务器的内存?jxl 里面有 个 ReadWrite.java 没有关闭读的,只关闭了写的】 book.close(); return list; } public static void setCellValueDirectly(WritableSheet sheet, Cell cell, Object newValue, CellType type) throws Exception{ if(type == CellType.DATE || type == CellType.DATE_FORMULA){ sheet.addCell( new jxl.write.DateTime( cell.getColumn() , cell.getRow() , (Date)newValue, new jxl.write.WritableCellFormat( cell.getCellFormat() ) ) ); }else if(type == CellType.NUMBER || type == CellType.NUMBER_FORMULA){ sheet.addCell( new jxl.write.Number( cell.getColumn() , cell.getRow() , ((Double)newValue).doubleValue(), new jxl.write.WritableCellFormat( cell.getCellFormat() ) ) ); }else if(type == CellType.LABEL || type == CellType.STRING_FORMULA){ sheet.addCell( new Label( cell.getColumn() , cell.getRow() , (String)newValue , new jxl.write.WritableCellFormat( cell.getCellFormat() ) ) ); }else{ throw new Exception("不支持的其它单元格类型:"+type); // System.err.println("不支持的其它单元格类型:" + cell.getType() + " at " + cell.getColumn() + "," + cell.getRow() +" current content:" + cell.getContents()); } } 自定义颜色设置 JXL 实例(二) package jxlpractice; import jxl.*; import jxl.write.*; import java.io.*; import java.io.File.*; import java.util.*; public class jxlexample { public static void main(String args[]) { String targetFile = "c:\\jxlexample.xls"; //输出的 excel 文件名 String workSheet = "testjxl"; //输出的 excel 文件工作表名 String[] title = { "aaa", "bbb", "ccc"}; //excel 工作表的标题 WritableWorkbook workbook;//创建可写入的 excel 工作 bo try { System.out.println("begin"); OutputStream os = new FileOutputStream(targetFile); workbook = Workbook.createWorkbook(os); WritableSheet sheet = workbook.createSheet(workSheet, 0); //添加第一个工作表 //WritableSheet sheet1 = workbook.createSheet("MySheet1", 1); //可添加第二个工作 jxl.write.Label label; for (int i = 0; i < title.length; i++) { //Label(列号,行号 ,内容 ) label = new jxl.write.Label(i, 0, title[i]); //put the title in row1 sheet.addCell(label); } //下列添加的对字体等的设置均调试通过,可作参考用 //添加数字 Number(列号,行号,内容) jxl.write.Number number = new jxl.write.Number(0, 1, 3.14159); //put the number 3.14159 in cell D5 sheet.addCell(number); //添加带有字型 Formatting 的对象 jxl.write.WritableFont wf = new jxl.write.WritableFont(WritableFont.TIMES, 10, WritableFont.BOLD, true); jxl.write.WritableCellFormat wcfF = new jxl.write.WritableCellFormat(wf); jxl.write.Label labelCF = new jxl.write.Label(4, 4, "文本", wcfF); sheet.addCell(labelCF); //添加带有字体颜色,带背景颜色 Formatting 的对象 jxl.write.WritableFont wfc = new jxl.write.WritableFont(WritableFont. ARIAL, 10, WritableFont.BOLD, false, jxl.format.UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.RED); jxl.write.WritableCellFormat wcfFC = new jxl.write.WritableCellFormat(wfc); wcfFC.setBackground(jxl.format.Colour.BLUE); jxl.write.Label labelCFC = new jxl.write.Label(1, 5, "带颜色", wcfFC); sheet.addCell(labelCFC); //添加带有 formatting 的 Number 对象 jxl.write.NumberFormat nf = new jxl.write.NumberFormat("#.##"); jxl.write.WritableCellFormat wcfN = new jxl.write.WritableCellFormat(nf); jxl.write.Number labelNF = new jxl.write.Number(1, 8, 3.1415926, wcfN); sheet.addCell(labelNF); //3.添加 Boolean 对象 jxl.write.Boolean labelB = new jxl.write.Boolean(0, 2, false); sheet.addCell(labelB); //4.添加 DateTime 对象 jxl.write.DateTime labelDT = new jxl.write.DateTime(0, 3, new java.util.Date()); sheet.addCell(labelDT); //添加带有 formatting 的 DateFormat 对象 jxl.write.DateFormat df = new jxl.write.DateFormat("ddMMyyyyhh:mm:ss"); jxl.write.WritableCellFormat wcfDF = new jxl.write.WritableCellFormat(df); jxl.write.DateTime labelDTF = new jxl.write.DateTime(1, 3, new java.util.Date(), wcfDF); sheet.addCell(labelDTF); //和宾单元格 //sheet.mergeCells(int col1,int row1,int col2,int row2);//左上角到右下角 sheet.mergeCells(4, 5, 8, 10); //左上角到右下角(4,5),(8,10)分别为左上角和右下角的坐标 wfc = new jxl.write.WritableFont(WritableFont.ARIAL, 40, WritableFont.BOLD, false, jxl.format.UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.GREEN); jxl.write.WritableCellFormat wchB = new jxl.write.WritableCellFormat(wfc); wchB.setAlignment(jxl.format.Alignment.CENTRE); labelCFC = new jxl.write.Label(4, 5, "单元合并", wchB); sheet.addCell(labelCFC); // //设置边框 jxl.write.WritableCellFormat wcsB = new jxl.write.WritableCellFormat(); wcsB.setBorder(jxl.format.Border.ALL, jxl.format.BorderLineStyle.THICK); labelCFC = new jxl.write.Label(0, 6, "边框设置", wcsB); sheet.addCell(labelCFC); workbook.write(); workbook.close(); } catch (Exception e) { e.printStackTrace(); } System.out.println("end"); Runtime r = Runtime.getRuntime(); Process p = null; //String cmd[]={"notepad","exec.java"}; /*String cmd[] = { "C:\Program Files\Microsoft Office\Office\EXCEL.EXE", "out.xls"}; try { p = r.exec(cmd); } } catch (Exception ex) { }*/ } } Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1754921 jxl 操作 Excel 源码 /** * 将个人信息导出到 Excel 表 */ public void grxxExportXLS(HttpServletResponse response, Grxx grxx, PageBean p) { List list = queryGrxxList(grxx, p); try { // String targetfile = getServlet().getServletContext().getRealPath( // "/companymanage") // + "/grxxlistxls.xls"; // Method 1:创建可写入的 Excel 工作薄 // jxl.write.WritableWorkbook wwb = Workbook.createWorkbook(new // File( // targetfile)); // Method 2:将 WritableWorkbook 直接写入到输出流 OutputStream os = response.getOutputStream(); String fs = "个人信息表"; fs = new String(fs.getBytes("gb2312"), "iso8859-1"); response.reset();// 清空输出流 response.setContentType("application/msexcel");// 定义输出类型 response.setHeader("Content-disposition", "attachment; filename=" + fs + ".xls");// 设定输出文件头 jxl.write.WritableWorkbook wwb = Workbook.createWorkbook(os); // 创建 Excel 工作表 jxl.write.WritableSheet ws = wwb.createSheet("个人信息表 1", 0); /** * 19 列,标题占据 2 行 */ int charTitle = 10;// 标题字体大小 int charNormal = 10;// 标题字体大小 // 添加带有字型 Formatting 的对象 // 用于标题 jxl.write.WritableFont titleFont = new jxl.write.WritableFont( WritableFont.createFont("宋体"), charTitle, WritableFont.BOLD); jxl.write.WritableCellFormat titleFormat = new jxl.write.WritableCellFormat( titleFont); titleFormat.setBorder(Border.ALL, BorderLineStyle.THIN); // 线条 titleFormat.setVerticalAlignment(VerticalAlignment.CENTRE); // 垂直对齐 titleFormat.setAlignment(Alignment.CENTRE); // 水平对齐 titleFormat.setWrap(true); // 是否换行 titleFormat.setBackground(Colour.GRAY_25);// 背景色暗灰-25% // 用于正文 WritableFont normalFont = new WritableFont(WritableFont .createFont("宋体"), charNormal); jxl.write.WritableCellFormat normalFormat = new jxl.write.WritableCellFormat( normalFont); normalFormat.setBorder(Border.ALL, BorderLineStyle.THIN); // 线条 normalFormat.setVerticalAlignment(VerticalAlignment.CENTRE); // 垂直对齐 normalFormat.setAlignment(Alignment.CENTRE);// 水平对齐 normalFormat.setWrap(true); // 是否换行 // 用于带有 formatting 的 Number 对象 WritableFont nf = new WritableFont(WritableFont .createFont("Times New Roman"), charNormal); // jxl.write.NumberFormat nf = new jxl.write.NumberFormat("#.##"); jxl.write.WritableCellFormat wcfN = new jxl.write.WritableCellFormat( nf); wcfN.setBorder(Border.ALL, BorderLineStyle.THIN); // 线条 wcfN.setVerticalAlignment(VerticalAlignment.CENTRE); // 垂直对齐 wcfN.setAlignment(Alignment.CENTRE);// 水平对齐 wcfN.setWrap(true); // 是否换行 /** * 添加标题 */ // 第一行 /** *********设置列宽每个字体占 charset 个**************** */ ws.mergeCells(14, 0, 18, 0); // 合并单元格, ws.mergeCells(10, 0, 13, 0); // 合并单元格, ws.mergeCells(0, 0, 0, 1); // 合并单元格,序号 ws.setColumnView(0, 6); // 设置列宽,第 1 列 ws.mergeCells(1, 0, 1, 1); // 合并单元格,公民身份证号 ws.setColumnView(1, 9); // 设置列宽,第 2 列 ws.mergeCells(2, 0, 2, 1); // 合并单元格,电脑序号 ws.setColumnView(2, 6); // 设置列宽,第 3 列 ws.mergeCells(3, 0, 3, 1); // 合并单元格,四险姓名 ws.setColumnView(3, 6); // 设置列宽,第 4 列 ws.mergeCells(4, 0, 4, 1); // 合并单元格,医疗姓名 ws.setColumnView(4, 6); // 设置列宽,第 5 列 ws.mergeCells(5, 0, 5, 1); // 合并单元格,医疗保险手册号 ws.setColumnView(5, 9); // 设置列宽,第 6 列 ws.mergeCells(6, 0, 6, 1); // 合并单元格,四险缴费人员类别 ws.setColumnView(6, 9); // 设置列宽,第 7 列 ws.mergeCells(7, 0, 7, 1); // 合并单元格,医疗缴费人员类别 ws.setColumnView(7, 9); // 设置列宽,第 8 列 ws.mergeCells(8, 0, 8, 1); // 合并单元格,医疗参保人员类别 ws.setColumnView(8, 9); // 设置列宽,第 9 列 ws.mergeCells(9, 0, 9, 1); // 合并单元格,医疗参保状态 ws.setColumnView(9, 7); // 设置列宽,第 10 列 ws.setColumnView(10, 6); // 设置列宽,第 11 列 ws.setColumnView(11, 6); // 设置列宽,第 12 列 ws.setColumnView(12, 6); // 设置列宽,第 13 列 ws.setColumnView(13, 6); // 设置列宽,第 14 列 ws.setColumnView(14, 6); // 设置列宽,第 15 列 ws.setColumnView(15, 6); // 设置列宽,第 16 列 ws.setColumnView(16, 6); // 设置列宽,第 17 列 ws.setColumnView(17, 6); // 设置列宽,第 18 列 ws.setColumnView(18, 6); // 设置列宽,第 19 列 jxl.write.Label tit00 = new jxl.write.Label(0, 0, "序号", titleFormat); ws.addCell(tit00); jxl.write.Label tit10 = new jxl.write.Label(1, 0, "公民身份证号", titleFormat); ws.addCell(tit10); jxl.write.Label tit20 = new jxl.write.Label(2, 0, "电脑序号", titleFormat); ws.addCell(tit20); jxl.write.Label tit30 = new jxl.write.Label(3, 0, "四险姓名", titleFormat); ws.addCell(tit30); jxl.write.Label tit40 = new jxl.write.Label(4, 0, "医疗姓名", titleFormat); ws.addCell(tit40); jxl.write.Label tit50 = new jxl.write.Label(5, 0, "医疗保险手册号", titleFormat); ws.addCell(tit50); jxl.write.Label tit60 = new jxl.write.Label(6, 0, "四险缴费人员类别", titleFormat); ws.addCell(tit60); jxl.write.Label tit70 = new jxl.write.Label(7, 0, "医疗缴费人员类别", titleFormat); ws.addCell(tit70); jxl.write.Label tit80 = new jxl.write.Label(8, 0, "医疗参保人员类别", titleFormat); ws.addCell(tit80); jxl.write.Label tit90 = new jxl.write.Label(9, 0, "医疗参保状态", titleFormat); ws.addCell(tit90); jxl.write.Label tit100 = new jxl.write.Label(10, 0, "四险缴费状态", titleFormat); ws.addCell(tit100); jxl.write.Label tit140 = new jxl.write.Label(14, 0, "缴费基数", titleFormat); ws.addCell(tit140); // 第二行 jxl.write.Label tit101 = new jxl.write.Label(10, 1, "养老", titleFormat); ws.addCell(tit101); jxl.write.Label tit111 = new jxl.write.Label(11, 1, "失业", titleFormat); ws.addCell(tit111); jxl.write.Label tit121 = new jxl.write.Label(12, 1, "工伤", titleFormat); ws.addCell(tit121); jxl.write.Label tit131 = new jxl.write.Label(13, 1, "生育", titleFormat); ws.addCell(tit131); jxl.write.Label tit141 = new jxl.write.Label(14, 1, "养老", titleFormat); ws.addCell(tit141); jxl.write.Label tit151 = new jxl.write.Label(15, 1, "失业", titleFormat); ws.addCell(tit151); jxl.write.Label tit161 = new jxl.write.Label(16, 1, "工伤", titleFormat); ws.addCell(tit161); jxl.write.Label tit171 = new jxl.write.Label(17, 1, "生育", titleFormat); ws.addCell(tit171); jxl.write.Label tit181 = new jxl.write.Label(18, 1, "医疗", titleFormat); ws.addCell(tit181); double yljs = 0;// 医疗基数合计 double yxjs = 0;// 养老基数合计 double syjs = 0;// 失业基数合计 double sxjs = 0;// 生育基数合计 double gsjs = 0;// 工伤基数合计 for (int i = 0; i < list.size(); i++) { Grxx xx = (Grxx) list.get(i); jxl.write.Label lab1 = new jxl.write.Label(0, i + 2, String .valueOf(i + 1), wcfN); ws.addCell(lab1);// 第 1 列:序号 jxl.write.Label lab2 = new jxl.write.Label(1, i + 2, xx .getBzhm(), wcfN); ws.addCell(lab2);// 第 2 列:公民身份证号 jxl.write.Label lab3 = new jxl.write.Label(2, i + 2, "字段不存在", wcfN); ws.addCell(lab3);// 第 3 列:电脑序号 jxl.write.Label lab4 = new jxl.write.Label(3, i + 2, xx.getXm(), normalFormat); ws.addCell(lab4);// 第 4 列:四险姓名 jxl.write.Label lab5 = new jxl.write.Label(4, i + 2, xx.getXm(), normalFormat); ws.addCell(lab5);// 第 5 列:医疗姓名 jxl.write.Label lab6 = new jxl.write.Label(5, i + 2, xx .getBxh(), wcfN); ws.addCell(lab6);// 第 6 列:医疗保险手册号 jxl.write.Label lab7 = new jxl.write.Label(6, i + 2, xx .getBxh(), normalFormat); ws.addCell(lab7);// 第 7 列:四险缴费人员类别 jxl.write.Label lab8 = new jxl.write.Label(7, i + 2, "字段不存在", normalFormat); ws.addCell(lab8);// 第 8 列:医疗缴费人员类别 jxl.write.Label lab9 = new jxl.write.Label(8, i + 2, "字段不存在", normalFormat); ws.addCell(lab9);// 第 9 列:医疗参保人员类别 jxl.write.Label lab10 = new jxl.write.Label(9, i + 2, "字段不存在", normalFormat); ws.addCell(lab10);// 第 10 列:医疗参保状态 jxl.write.Label lab11 = new jxl.write.Label(10, i + 2, "字段不存在", normalFormat); ws.addCell(lab11);// 第 11 列:养老缴费状态 jxl.write.Label lab12 = new jxl.write.Label(11, i + 2, "字段不存在", normalFormat); ws.addCell(lab12);// 第 12 列:失业缴费状态 jxl.write.Label lab13 = new jxl.write.Label(12, i + 2, "字段不存在", normalFormat); ws.addCell(lab13);// 第 13 列:工伤缴费状态 jxl.write.Label lab14 = new jxl.write.Label(13, i + 2, "字段不存在", normalFormat); ws.addCell(lab14);// 第 14 列:生育缴费状态 jxl.write.Number lab15 = new jxl.write.Number(14, i + 2, xx .getGrjs().getYxjfjs().doubleValue(), wcfN); ws.addCell(lab15);// 第 15 列:养老缴费基数 yxjs += xx.getGrjs().getYxjfjs().doubleValue(); jxl.write.Number lab16 = new jxl.write.Number(15, i + 2, xx .getGrjs().getSyjfjs().doubleValue(), wcfN); ws.addCell(lab16);// 第 16 列:失业缴费基数 syjs += xx.getGrjs().getSyjfjs().doubleValue(); jxl.write.Number lab17 = new jxl.write.Number(16, i + 2, xx .getGrjs().getGsjfjs().doubleValue(), wcfN); ws.addCell(lab17);// 第 17 列:工伤缴费基数 gsjs += xx.getGrjs().getGsjfjs().doubleValue(); jxl.write.Number lab18 = new jxl.write.Number(17, i + 2, xx .getGrjs().getSxjfjs().doubleValue(), wcfN); ws.addCell(lab18);// 第 18 列:生育缴费基数 sxjs += xx.getGrjs().getSxjfjs().doubleValue(); jxl.write.Number lab19 = new jxl.write.Number(18, i + 2, xx .getGrjs().getYljfjs().doubleValue(), wcfN); ws.addCell(lab19);// 第 19 列:医疗缴费基数 yljs += xx.getGrjs().getYljfjs().doubleValue(); } /** * 最后一行合计 */ int end = list.size() + 2; jxl.write.Label end0 = new jxl.write.Label(0, end, "合计", normalFormat); ws.addCell(end0); jxl.write.Label end1 = new jxl.write.Label(1, end, "--", normalFormat); ws.addCell(end1); jxl.write.Label end2 = new jxl.write.Label(2, end, "--", normalFormat); ws.addCell(end2); jxl.write.Label end3 = new jxl.write.Label(3, end, "--", normalFormat); ws.addCell(end3); jxl.write.Label end4 = new jxl.write.Label(4, end, "--", normalFormat); ws.addCell(end4); jxl.write.Label end5 = new jxl.write.Label(5, end, "--", normalFormat); ws.addCell(end5); jxl.write.Label end6 = new jxl.write.Label(6, end, "--", normalFormat); ws.addCell(end6); jxl.write.Label end7 = new jxl.write.Label(7, end, "--", normalFormat); ws.addCell(end7); jxl.write.Label end8 = new jxl.write.Label(8, end, "--", normalFormat); ws.addCell(end8); jxl.write.Label end9 = new jxl.write.Label(9, end, "--", normalFormat); ws.addCell(end9); jxl.write.Label end10 = new jxl.write.Label(10, end, "--", normalFormat); ws.addCell(end10); jxl.write.Label end11 = new jxl.write.Label(11, end, "--", normalFormat); ws.addCell(end11); jxl.write.Label end12 = new jxl.write.Label(12, end, "--", normalFormat); ws.addCell(end12); jxl.write.Label end13 = new jxl.write.Label(13, end, "--", normalFormat); ws.addCell(end13); // 养老 jxl.write.Number end14 = new jxl.write.Number(14, end, yxjs, wcfN); ws.addCell(end14); // 失业 jxl.write.Number end15 = new jxl.write.Number(15, end, syjs, wcfN); ws.addCell(end15); // 工伤 jxl.write.Number end16 = new jxl.write.Number(16, end, gsjs, wcfN); ws.addCell(end16); // 生育 jxl.write.Number end17 = new jxl.write.Number(17, end, sxjs, wcfN); ws.addCell(end17); // 医疗 jxl.write.Number end18 = new jxl.write.Number(18, end, yljs, wcfN); ws.addCell(end18); // 写入 Exel 工作表 wwb.write(); // 关闭 Excel 工作薄对象 wwb.close(); os.close(); } catch (Exception e) { e.printStackTrace(); } } 2.poi 生成表 Poicreate 代码 package excel; import java.io.FileOutputStream; import java.text.SimpleDateFormat; import java.util.Date; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.DataFormat; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.util.CellRangeAddress; /*********************************************************************** * * poiCreate.java * @copyright Copyright: 2009-2012 * @creator 周辉
* @create-time Mar 9, 2010 2:27:52 PM * @revision $Id: * ***********************************************************************/ public class poiCreate { /** * @param args */ public static void main(String[] args) throws Exception { //创建一个 EXCEL Workbook wb = new HSSFWorkbook(); DataFormat format = wb.createDataFormat(); CellStyle style; //创建一个 SHEET Sheet sheet1 = wb.createSheet("产品清单"); String[] title = {"编号","产品名称","产品价格","产品数量","生产日期","产地","是否出口"}; int i=0; //创建一行 Row row = sheet1.createRow((short)0); //填充标题 for (String s:title){ Cell cell = row.createCell(i); cell.setCellValue(s); i++; } Row row1 = sheet1.createRow((short)1); //下面是填充数据 row1.createCell(0).setCellValue(20071001); row1.createCell(1).setCellValue("金鸽瓜子"); //创建一个单元格子 Cell cell2=row1.createCell(2); // 填充产品价格 cell2.setCellValue(2.45); style = wb.createCellStyle(); style.setDataFormat(format.getFormat("#.##")); //设定样式 cell2.setCellStyle(style); // 填充产品数量 row1.createCell(3).setCellValue(200); /* * 定义显示日期的公共格式 * 如:yyyy-MM-dd hh:mm * */ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); String newdate = sdf.format(new Date()); // 填充出产日期 row1.createCell(4).setCellValue(newdate); row1.createCell(5).setCellValue("陕西西安"); /* * 显示布尔值 * */ row1.createCell(6).setCellValue(true); /* * 合并单元格 * 通过 writablesheet.mergeCells(int x,int y,int m,int n);来实现的 * 表示将 first row, last row,first column,last column * * */ Row row2 = sheet1.createRow((short) 2); Cell cell3 = row2.createCell((short) 0); cell3.setCellValue("合并了三个单元格"); sheet1.addMergedRegion(new CellRangeAddress(2,2,0,2)); FileOutputStream fileOut = new FileOutputStream("d:\\test.xls"); wb.write(fileOut); fileOut.close(); } }
还剩68页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享pdf获得金币 ] 3 人已下载

下载pdf

pdf贡献者

yxhxj2006

贡献于2012-04-20

下载需要 10 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf