您的位置:首页 > 编程语言 > Java开发

java对Excel的读写操作

2011-09-06 10:19 465 查看
 
import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.util.ArrayList;

import java.util.List;

import jxl.Cell;

import jxl.CellType;

import jxl.NumberCell;

import jxl.Sheet;

import jxl.Workbook;

import jxl.format.UnderlineStyle;

import jxl.read.biff.BiffException;

import jxl.write.Label;

import jxl.write.WritableFont;

import jxl.write.WritableSheet;

import jxl.write.WritableWorkbook;

import jxl.write.WriteException;

import jxl.write.biff.RowsExceededException;

import org.apache.poi.hssf.usermodel.HSSFCell;

import org.apache.poi.hssf.usermodel.HSSFCellStyle;

import org.apache.poi.hssf.usermodel.HSSFRow;

import org.apache.poi.hssf.usermodel.HSSFSheet;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import org.apache.poi.poifs.filesystem.POIFSFileSystem;

public class ExcelOpt {

 /**

  * 生成一个Excel文件 jxl

  *

  * @param fileName

  *            要生成的Excel文件名

  * @jxl.jar 版本:2.6

  */

 public static void writeExcel(String fileName) {

  WritableWorkbook wwb = null;

  try {

   // 首先要使用Workbook类的工厂方法创建一个可写入的工作薄(Workbook)对象

   wwb = Workbook.createWorkbook(new File(fileName));

  } catch (IOException e) {

   e.printStackTrace();

  }

  if (wwb != null) {

   // 创建一个可写入的工作表

   // Workbook的createSheet方法有两个参数,第一个是工作表的名称,第二个是工作表在工作薄中的位置

   WritableSheet ws = wwb.createSheet("工作表名称", 0);

   // 下面开始添加单元格

   for (int i = 0; i < 10; i++) {

    for (int j = 0; j < 5; j++) {

     // 这里需要注意的是,在Excel中,第一个参数表示列,第二个表示行

     Label labelC = new Label(j, i, "这是第" + (i + 1) + "行,第"

       + (j + 1) + "列");

     try {

      // 将生成的单元格添加到工作表中

      ws.addCell(labelC);

     } catch (RowsExceededException e) {

      e.printStackTrace();

     } catch (WriteException e) {

      e.printStackTrace();

     }

    }

   }

   try {

    // 从内存中写入文件中

    wwb.write();

    // 关闭资源,释放内存

    wwb.close();

   } catch (IOException e) {

    e.printStackTrace();

   } catch (WriteException e) {

    e.printStackTrace();

   }

  }

 }

 /**

  * 生成一个Excel文件POI

  *

  * @param inputFile

  *            输入模板文件路径

  * @param outputFile

  *            输入文件存放于服务器路径

  * @param dataList

  *            待导出数据

  * @throws Exception

  * @roseuid:

  */

 public static void exportExcelFile(String inputFile, String outputFile,

   List dataList) throws Exception {

  // 用模板文件构造poi

  POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(inputFile));

  // 创建模板工作表

  HSSFWorkbook templatewb = new HSSFWorkbook(fs);

  // 直接取模板第一个sheet对象

  HSSFSheet templateSheet = templatewb.getSheetAt(1);

  // 得到模板的第一个sheet的第一行对象 为了得到模板样式

  HSSFRow templateRow = templateSheet.getRow(0);

  // HSSFSheet timplateSheet = templatewb.getSheetAt(1);

  // 取得Excel文件的总列数

  int columns = templateSheet.getRow((short) 0)

    .getPhysicalNumberOfCells();

  // Debug.println("columns is : " + columns); //=========================

  // 创建样式数组

  HSSFCellStyle styleArray[] = new HSSFCellStyle[columns];

  // 一次性创建所有列的样式放在数组里

  for (int s = 0; s < columns; s++) {

   // 得到数组实例

   styleArray[s] = templatewb.createCellStyle();

  }

  // 循环对每一个单元格进行赋值

  // 定位行

  for (int rowId = 1; rowId < dataList.size(); rowId++) {

   // 依次取第rowId行数据 每一个数据是valueList

   List valueList = (List) dataList.get(rowId - 1);

   // 定位列

   for (int columnId = 0; columnId < columns; columnId++) {

    // 依次取出对应与colunmId列的值

    // 每一个单元格的值

    String dataValue = (String) valueList.get(columnId);

    // 取出colunmId列的的style

    // 模板每一列的样式

    HSSFCellStyle style = styleArray[columnId];

    // 取模板第colunmId列的单元格对象

    // 模板单元格对象

    HSSFCell templateCell = templateRow.getCell((short) columnId);

    // 创建一个新的rowId行 行对象

    // 新建的行对象

    HSSFRow hssfRow = templateSheet.createRow(rowId);

    // 创建新的rowId行 columnId列 单元格对象

    // 新建的单元格对象

    HSSFCell cell = hssfRow.createCell((short) columnId);

    // 如果对应的模板单元格 样式为非锁定

    if (templateCell.getCellStyle().getLocked() == false) {

     // 设置此列style为非锁定

     style.setLocked(false);

     // 设置到新的单元格上

     cell.setCellStyle(style);

    }

    // 否则样式为锁定

    else {

     // 设置此列style为锁定

     style.setLocked(true);

     // 设置到新单元格上

     cell.setCellStyle(style);

    }

    // 设置编码

    // cell.setEncoding(HSSFCell.ENCODING_UTF_16);

    // Debug.println("dataValue : " + dataValue);

    // 设置值 统一为String

    cell.setCellValue(dataValue);

   }

  }

  // 设置输入流

  FileOutputStream fOut = new FileOutputStream(outputFile);

  // 将模板的内容写到输出文件上

  templatewb.write(fOut);

  fOut.flush();

  // 操作结束,关闭文件

  fOut.close();

 }

 /**

  * 导出数据为XLS格式

  *

  * @param fos

  *            生成Excel文件Path

  * @param bo

  *            要导入的数据

  */

 public static void writeExcelBo(String fos, java.util.List ve) {

  jxl.write.WritableWorkbook wwb;

  try {

   wwb = Workbook.createWorkbook(new File(fos));

   jxl.write.WritableSheet ws = wwb.createSheet("上市新书", 10);

   ws.addCell(new jxl.write.Label(0, 1, "书名"));

   ws.addCell(new jxl.write.Label(1, 1, "作者"));

   ws.addCell(new jxl.write.Label(2, 1, "定价"));

   ws.addCell(new jxl.write.Label(3, 1, "出版社"));

   int bookSize = ve.size();

   BookVO book = new BookVO();

   for (int i = 0; i < bookSize; i++) {

    book = (BookVO) ve.get(i);

    ws.addCell(new jxl.write.Label(0, i + 2, ""

      + book.getBookName()));

    ws.addCell(new jxl.write.Label(1, i + 2, book.getBookAuthor()));

    ws.addCell(new jxl.write.Label(2, i + 2, ""

      + book.getBookPrice()));

    ws

      .addCell(new jxl.write.Label(3, i + 2, book

        .getBookConcern()));

   }

   // jxl.write.WritableFont wfc=

   // new

   // jxl.write.WritableFont(WritableFont.ARIAL,255,WritableFont.BOLD,false,UnderlineStyle.NO_UNDERLINE,jxl.format.Colour.BLACK);

   // jxl.write.WritableCellFormat wcfFC= new

   // jxl.write.WritableCellFormat(wfc);

   ws.addCell(new jxl.write.Label(0, 0, "2007年07月即将上市新书!"));

   wwb.write();

   // 关闭Excel工作薄对象

   wwb.close();

  } catch (IOException e) {

  } catch (RowsExceededException e) {

  } catch (WriteException e) {

  }

 }

 public static void readExcel() {

  // 通过Workbook的静态方法getWorkbook选取Excel文件

  Workbook workbook;

  try {

   workbook = Workbook.getWorkbook(new File("c:\\上市新书.xls"));

   // 通过Workbook的getSheet方法选择第一个工作簿(从0开始)

   Sheet sheet = workbook.getSheet(0);

   // 通过Sheet方法的getCell方法选择位置为C2的单元格(两个参数都从0开始)

   Cell c2 = sheet.getCell(2, 2);

   // 通过Cell的getContents方法把单元格中的信息以字符的形式读取出来

   String stringc2 = c2.getContents();

   System.out.println(stringc2);

   // 可以看到正是刚才所说的四个步骤。

   // 我们都知道Excel单元格是有格式的,那么这些信息如何取得。

   // Cell提供了一个getType方法能够返回单元格的类型信息,同时JXL提供了一个CellType类用来预设Excel中的类型信息,而且JXL提供了一些Cell类的子类用来分别用来表示各种类型的单元格,如LabelCell,NumberCell,DateCell分别表示字符、数值、日期类型的单元格。所以我们可以这样写:

   if (c2.getType() == CellType.NUMBER) {

    NumberCell nc = (NumberCell) c2;

    double numberb2 = nc.getValue();

    System.out.println(numberb2);

   }

   // 最后不要忘记关闭workbook以释放资源:

   workbook.close();

   // 现在总结一下:三个对象,四个步骤,注意格式。就可以轻松的从Excel文件中读取数据。

  } catch (BiffException e) {

   // TODO Auto-generated catch block

   e.printStackTrace();

  } catch (IOException e) {

   // TODO Auto-generated catch block

   e.printStackTrace();

  }

 }

 public static void main(String[] args) throws BiffException, IOException {

  // writeExcel("c:\\Test测试Excel.xls");

  // System.out.println("OK");

  // ArrayList list = new ArrayList();

  //

  // for (int i = 0; i < 10; i++) {

  // BookVO book = new BookVO();

  // book.setBookName("WebWork in action+" + i);

  // book.setBookAuthor("唐勇+" + i);

  // book.setBookPrice("39元+" + i);

  // book.setBookConcern("飞思科技+" + i);

  // list.add(book);

  // }

  //

  // writeExcelBo("c:\\上市新书.xls", list);

  // System.err.println("Book OK!!!");

  readExcel();

 }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息