`
thinkerAndThinker
  • 浏览: 284704 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

jxl读写excel常见操作搜集整理

 
阅读更多

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;

/**
* 该文件演示了常见的对excel的操作:
* 1.文件的输出、改写、复制+改写(用于模板……)
* 2.改写时保持单元格的值类型
* 3.设置、编辑各种样式:字体、单元格高宽、数字格式化、合并单元格、计算公式、边框……
* @author chenxiaowen
*
*/
public class WriteExcelTest {
static HashMap map = new HashMap();
/**
* @param args
*/
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();
   }
}


/**
* 修改现有文件的样式、值
* @param inputFile
* @throws Exception
*/
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();
}

 

 

/**
* 直截在原文件上面修改,采用 从模板产生新的输出 的方式,覆盖自己
* @param file
*/
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);
   }
}


/**
* 从模板产生新的输出
* @param inputFile
* @param outputFile
*/
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);
   }
}

 

/**
* 复制数据和格式
* @param inputFile
* @param inputFileSheetIndex
* @param outputFilePath
* @throws Exception
*/
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();
}


/**
* 写excel的时候使用各种样式、数据类型
* @param outputFilePath
* @param outputFileSheetName
* @throws Exception
*/
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, 8);//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();
}


/**
* 画一个边框
* @param sheet
* @param x
* @param y
* @param width
* @param height
* @param style
* @param BorderColor
* @param bgColor
* @throws WriteException
*/
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++;
   }
}


/**
* 简单的读取excel
* @param inputFile
* @param inputFileSheetIndex
* @throws Exception
*/
public static ArrayList<String> sampleReadExcel(File inputFile, int inputFileSheetIndex) throws Exception {
   ArrayList<String> list = new ArrayList<String>();
   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;
}

 

/**
* 直截设置现有单元格的值,数据类型支持Date、Double、String,可以设置现有数据格式为 DATE、DATE_FORMULA,NUMBER、NUMBER_FORMULA,LABEL、STRING_FORMULA
* @param sheet
* @param cell
* @param newValue
* @param type
* @throws RowsExceededException
* @throws WriteException
*/
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.EMPTY){
    //空的以及合并单元格中第一列外的
//    System.out.println("EMPTY:"+cell.getContents());
//    System.err.println("空单元格 at " + colIndex + "," + rowIndex +" content:" + cell.getContents());
   }*/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 导出 excel

    在Java编程环境中,JXL库是一个非常流行的工具,用于读取和写入Excel文件。"jxl 导出 excel"的标题和描述暗示了我们将会讨论如何使用JXL库从数据库中导出数据到Excel文档的过程。这个过程涉及到Java编程、数据库操作...

    Java操作Excel之理解JXL-读取Excel.docx

    【Java操作Excel之理解JXL-读取Excel.docx】的知识点主要集中在使用JXL库进行Excel文件的读取操作。JXL是一个Java API,专为处理Microsoft Excel文件设计,支持在任何Java兼容的操作系统上运行。以下是详细的解析: ...

    jxl操作excel进行删除和修改

    以下是一个简单的示例,展示如何使用jxl读取Excel文件: ```java import jxl.*; public class ExcelReader { public static void main(String[] args) throws Exception { Workbook workbook = Workbook....

    用Jxls导入导出Excel2003和Excel2007数据3

    本人从网上搜集资料,加上自己研究探索,现在完成了用Jxls导入导出Excel2003和Excel2007数据,读取和写入xls和xlsx文件,现把结果告诉大家,希望大家不走弯路,直接掌握先进实用的技术,解决实际工作问题。...

    网络上搜集的JXL相关资源,包括jar包和一些网页

    1. **读取Excel文件**:JXL可以解析Excel文件的单元格、行、列、工作表等,提取数据并进行处理。 2. **写入Excel文件**:允许开发者创建新的Excel文件,或者向现有文件中添加或修改数据,包括文本、数字、日期、公式...

    JXL根据模板文件,生成新文件,填充excel

    JXL是一个Java库,它允许开发人员读写Microsoft Excel文件,为处理电子表格数据提供了便利。在这个场景中,我们可能有一个预先设定格式和结构的模板Excel文件,然后通过编程方式将动态数据填入到模板中,生成新的...

    jxl使用,及与数据库之间的操作,详细应用代码。

    使用`Workbook.getWorkbook()`方法读取Excel文件。在这个例子中,我们读取名为"data/user.xls"的文件。如果你的Excel文件包含多个工作表(sheet),可以通过`wb.getSheets()`获取所有工作表的数组,然后遍历每个...

    jsp操作excel的登陆注册程序源码

    "jsp操作excel"指的是使用JSP页面来与Excel文件交互,这可能涉及到从Excel读取数据展示在网页上,或者将网页表单中的数据写入Excel文件。 "java操作excel"进一步强调了这个项目不仅限于JSP,也使用了Java后端代码来...

    jxl.jar包,配合案例代码

    描述中提到,"jxl2.6.3.jar包,配合案例代码,可以把java里面的数据输出到excel表里面,亲测可用",这意味着这个库不仅可以读取Excel文件,还能将Java程序中的数据写入Excel文件。这种功能对于数据处理和报告生成...

    用Jxls导入导出Excel2003和Excel2007数据2

    本人从网上搜集资料,加上自己研究探索,现在完成了用Jxls导入导出Excel2003和Excel2007数据,读取和写入xls和xlsx文件,现把结果告诉大家,希望大家不走弯路,直接掌握先进实用的技术,解决实际工作问题。...

    js导出excel

    4. **JXL库**:JXL是Java的一个开源库,用于读写Microsoft Excel文件。尽管我们是在JavaScript环境中工作,但我们可以利用服务器端的Java来使用JXL,然后将生成的Excel文件发送回客户端。 接下来,我们将分步骤介绍...

    利用javascript和jxl实现自定义报表的输出

    JXL是一个开源的Java库,允许开发者读取、写入和修改Excel文件(.xls格式)。它提供了API,使得处理Excel表格的数据变得非常简单,包括单元格的样式、公式、图表等。尽管JXL是Java库,但通过服务端的Java程序,我们...

    java操作DOC,PPT收集

    jxl提供了丰富的API来读写工作表,单元格,公式,样式等。 3. **读取DOC和PPT文件**: 使用Apache POI,你可以打开一个现有的DOC或PPT文件,然后遍历其内容。例如,对于DOC,你可以获取段落、句子和字体样式;对于...

    用java实现把excel数据导入到mysql数据库中.pdf

    这个过程通常涉及两个主要步骤:首先使用Java读取Excel文件中的数据,然后将这些数据写入MySQL数据库。以下是一个详细的步骤说明: 1. **读取Excel文件**: Java提供了多种库来处理Excel文件,例如JXL、Apache POI...

    java_报表打印与搜索引擎

    jxl 是一个流行的开源Java库,专门用于读写Microsoft Excel文件。通过jxl,开发者可以轻松地创建新的Excel工作簿,添加工作表,插入数据,甚至进行格式化,如设置单元格样式、颜色和公式。这对于需要导出数据到Excel...

    自备文件2自备文件2自备文件2

    6. `jxl-2.6.3.jar`是JExcelApi,一个用于读写Microsoft Excel文件的Java库。它允许开发者在Java程序中处理Excel工作簿。 7. `jos-i-res.jar`和`jos-i-purview.jar`看起来像是特定项目的一部分,"jos"可能是项目...

    JAVA SE学习精华集锦

    16. **jxl.jar**:用于读写Excel文件的库。 17. **代码复用**:遵循设计模式,如装饰者模式在Java IO包中的应用,以及代码重用的一般原则。 这些知识点涵盖了Java SE的各个方面,从基础API到高级特性和工具,对于...

    业余框架整合-SSHD-(1)-整体概述(2011-12-03更新)

    6. **jxl.jar**:这是 JExcelApi,一个用于读写 Microsoft Excel 文件的 Java 库,可能用于数据导入导出。 7. **log4j-1.2.16.jar**:这是一个广泛使用的日志记录框架,用于收集和管理应用程序的日志信息。 8. **...

Global site tag (gtag.js) - Google Analytics