`

ExcelUtils

    博客分类:
  • POI
阅读更多
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletResponse;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFHyperlink;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
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;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;



public class ExcelUtils {

// excel文件的路径
private String path = "";

/*
* 将表单提到全局域中是为了在最后的测试方法中获取一个excel工作薄中的表单数量<br/>
* 这样就为循环解析每个表单做了准备
*/
private Workbook workbook = null;

public ExcelUtils() {

}

public ExcelUtils(String path) {
this.path = path;
}

/**
* 在磁盘生成一个还有内容的excel,路径为path的属性。
*
* @param sheetName
*            导出的sheet名称
* @param fieldNames
*            列名数组
* @param datas
*            数据组
* @throws IOException
*/
public void makeExcel(String sheetName, String[] fieldNames,
List<String[]> datas) throws IOException {
// 在内存中生成工作薄
// HSSFWorkbook workbook = makeWorkBook(sheetName, fieldNames, datas);
workbook = makeWorkBook(sheetName, fieldNames, datas);

// 截取文件件路径
String filePath = path.substring(0, path.lastIndexOf("\\"));

// 如果路径不存在,创建路径
File file = new File(filePath);
if (!file.exists()) {
file.mkdirs();
}
FileOutputStream fileOut = new FileOutputStream(path);
workbook.write(fileOut);
fileOut.flush();
fileOut.close();
}

/**
* 在输出流中导出excel
*
* @param excelName
*            导出的excel名称 包括扩展名
* @param sheetName
*            导出的sheet名称
* @param fieldName
*            列名数组
* @param data
*            数据组
* @param response
*            response
*/
public void makeStreamExcel(String excelName, String sheetName,
String[] fieldName, List<String[]> data,
HttpServletResponse response) {
OutputStream os = null;
try {
response.reset(); // 清空输出流,此方法受限制,response的任何打开的流关闭之后不在reset
os = response.getOutputStream(); // 取得输出流
response.setHeader("Content-disposition", "attachment; filename="
+ new String(excelName.getBytes(), "ISO-8859-1")); // 设定输出文件头
response.setContentType("application/msexcel"); // 定义输出类型
} catch (IOException ex) {// 捕捉异常
System.out.println("流操作错误:" + ex.getMessage());
}
// 在内存中生成工作薄
HSSFWorkbook workbook = makeWorkBook(sheetName, fieldName, data);
try {
os.flush();
workbook.write(os);
} catch (IOException e) {
e.printStackTrace();
System.out.println("Output is closed");
}
}

/**
* 根据条件生成工作薄对象到内存。
*
* @param sheetName
*            工作表对象名称
* @param fieldNames
*            首行列名称
* @param datas
*            数据
* @return HSSFWorkbook
*/
private HSSFWorkbook makeWorkBook(String sheetName, String[] fieldNames,
List<String[]> datas) {
// 产生工作薄对象
HSSFWorkbook workbook = new HSSFWorkbook();
// 产生工作表对象
HSSFSheet sheet = workbook.createSheet();

//设置每列宽度
sheet.setColumnWidth(0, 3500);
sheet.setColumnWidth(1, 5000);
//设置表单名称
workbook.setSheetName(0, sheetName);
// 产生一行
HSSFRow row = sheet.createRow(0);
// 产生单元格
HSSFCell cell = null;
// 写入各字段的名称
for (int i = 0; i < fieldNames.length; i++) {
cell = row.createCell((short) i);
// 设置单元格的内容为字符串
cell.setCellType(HSSFCell.CELL_TYPE_STRING);

// 为了能够在单元格内输入中文,设置字符集为UTF-16
// cell.setEndcoding(HSSFCell.ENCODING_UTF_16);
cell.setCellValue(fieldNames[i]);
}

// 写入各记录,每条记录对应excel表中一行记录
for (int i = 0; i < datas.size(); i++) {
String[] tmp = datas.get(i);
// 生成一行
row = sheet.createRow(i + 1);
for (int j = 0; j < tmp.length; j++) {
cell = row.createCell((short) j);
// 设置单元格的字符类型为String
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
cell.setCellValue(new HSSFRichTextString((tmp[j] == null) ? ""
: tmp[j]));
//创建一个超链接
HSSFHyperlink link = new HSSFHyperlink(HSSFHyperlink.LINK_URL);
link.setAddress("http://zhidao.baidu.com");
   //给单元格添加样式
HSSFCellStyle cellStyle = workbook.createCellStyle();
    Font  font = workbook.createFont();
font.setColor(HSSFFont .COLOR_RED);
cellStyle.setFont(font);

if(j == 1){
    cell.setHyperlink(link);
    cell.setCellStyle(cellStyle);
    }
}
}
return workbook;
}


/**
* 修改表单中指定的单元格的内容
* @param sheetOrder
* @param column
* @param row
* @param content
* @throws FileNotFoundException
* @throws IOException
*/
public void write(int sheetOrder ,int column ,int row ,String content) throws FileNotFoundException, IOException{
Workbook workbook = new HSSFWorkbook(new POIFSFileSystem(new FileInputStream(path)));
Sheet sheet = workbook.getSheetAt(sheetOrder);
Row rows = sheet.createRow(row);
Cell cell = rows.createCell(column);
cell.setCellValue(content);
OutputStream fileOut = new FileOutputStream(path);
workbook.write(fileOut);
fileOut.flush();
fileOut.close();
}

/**
* 获取一个工作表最后一条记录的序号
* @param sheetOrder 工作表序号
* @return int
* @throws IOException
*/
public int getSheetLastRowNum(int sheetOrder)throws IOException{
Workbook workbook = new  HSSFWorkbook(new POIFSFileSystem(new FileInputStream(path)));
Sheet sheet = workbook.getSheetAt(sheetOrder);
return sheet.getLastRowNum();

}


/**
* 根据path属性在磁盘生成一个新的Excel
* @throws IOException
*/
public void makeEmptyExcel() throws IOException{
Workbook workbook = new HSSFWorkbook();
//创建一个名称为new sheet的表单
workbook.createSheet("new sheet");
//截取文件夹路径
String subPath = path.substring(0, path.lastIndexOf("\\"));
//如果文件不存在创建文件
File file = new File(subPath);
if(file.exists()){
file.mkdirs();
}
OutputStream fileOut = new FileOutputStream(subPath + "\\" + path.substring(path.lastIndexOf("\\")));
workbook.write(fileOut);
fileOut.flush();
fileOut.close();
}

/**
* 根据path属性,给已经存在的excel工作薄中添加工作表单。
* @param sheetName 表单名称
* @throws IOException
*/
public void makeEmptySheetInExistExcel(String sheetName) throws IOException{
workbook = new HSSFWorkbook(new POIFSFileSystem(new FileInputStream(path)));
//在已经存在的工作薄中新建一个空工作表单
Sheet sheet = workbook.createSheet(sheetName);
workbook.setSheetOrder(sheet.getSheetName(), workbook.getNumberOfSheets()-1);
//截取文件夹路径
String subPath = path.substring(0, path.lastIndexOf("\\"));
//如果文件不存在创建文件
File file = new File(subPath);
if(file.exists()){
file.mkdirs();
}
OutputStream fileOut = new FileOutputStream(subPath + "\\" + path.substring(path.lastIndexOf("\\")));
workbook.write(fileOut);
fileOut.flush();
fileOut.close();
}

/**
* 根据工作区的序号,读取该工作区下的所有记录,没一条记录是一个String[]<br/>
* 注意如果单元格中的数据时数字将会被自动转换成字符串<br/>
* 如果单元格中存在除数字、字符串以外的其他类型数据,将会产生错误。
* @param sheetOrder 工作区序号
* @return List<String[]>
* @throws IOException
*/
public List<String[]> getDataFromSheet(int sheetOrder) throws IOException{
Workbook workbook = new HSSFWorkbook(new POIFSFileSystem(new FileInputStream(path)));
Sheet sheet = workbook.getSheetAt(sheetOrder);
List<String[]> strArrays = new ArrayList<String[]>();
//得到的行数是基于0的索引,遍历所有的行
for(int i=0;i<=sheet.getLastRowNum();i++){
Row row = sheet.getRow(i);
String[] strs = new String[row.getLastCellNum()];
for(int k=0;k<row.getLastCellNum();k++){
Cell cell = row.getCell(k);
if(Cell.CELL_TYPE_NUMERIC == cell.getCellType()){
//用于格式化数字,只保留数字的整数部分
DecimalFormat format = new DecimalFormat("########");
strs[k] = format.format(cell.getNumericCellValue());
}else{
strs[k] = cell.getStringCellValue();
}
}
strArrays.add(strs);
}
return strArrays;
}


    public static void main(String[] args) throws Exception {
ExcelUtils eu = new ExcelUtils("D:\\aa\\bb\\导入手机号码日志.xls");
   
    //创建Excel
List<String[]> ss = new ArrayList<String[]>();
ss.add(new String[] { "你撒地方", "知道百度" });
ss.add(new String[] { "瓦尔", "zhidao.baidu.com" });
eu.makeExcel("smsLog", new String[] { "色粉", "的是否" }, ss);
//给工作薄中新增指定索引的表单
eu.makeEmptySheetInExistExcel("ee");
eu.makeEmptySheetInExistExcel("ff");
eu.makeEmptySheetInExistExcel("hh");
eu.makeEmptySheetInExistExcel("ii");
for(int i=0;i<eu.workbook.getNumberOfSheets();i++){
System.out.println(eu.workbook.getSheetAt(i).getSheetName());
}
//打印表格中的数据
/* List<String[]> strs = eu.getDataFromSheet(0);
for (String[] str : strs) {
for (String s : str) {
System.out.print(s+"\t\t");
}
System.out.println();
}*/

//给表单中指定的单元格写数据
/*String content = "Hello Worlds";
eu.write(0,2, 3, content);*/


    //构造一个空Excel
// eu.makeEmptyExcel();

}  
   

}
分享到:
评论

相关推荐

    ExcelUtils按模板导出所需的JAR包

    ExcelUtils工具类支持按照固定模板导出Excel,简单、易上手

    ExcelUtils-2.00.zip

    ExcelUtils is a helper to export excel report in java web project. It's like velocity, has own tags, but these tags is written in excel file. By these tags, you can custom your excel report format ...

    EXCELUTILS所需的JAR包

    ExcelUtils 是一个在WEB应用开发中的EXCEL导出工具;;用EXCELUTILS导出excel所需的JAR包:excelutils.jar poi-2.5.1.jar commons-logging.jar commons-digester.jar commons-beanutils.jar,加外可能还需加添加osh....

    ExcelUtils-1.41修改版-对应高版本POI

    现有的ExcelUtils配合高版本POI使用会有兼容性问题,特此对源码做了一些修改,使其能应用到新版本的POI中,jar包中包含修改后的源代码 注:去掉了ExcelUtils原版中的webwork包,如有需要请自行加入

    ExcelUtils.java

    ExcelUtils.java

    excelutils

    excelutils response 返回

    poi3.7操作excel并与excelutils-1.41.jar使用

    poi3.7.jar操作excel可上传图片,但官网的jar包下载后,不能与excelutils-1.41.jar导出汇总表并用,总报错。后经改双方源码,现可以实现根据模板生成数据,并根据模板导出汇总表之类的。

    excelUtils公共导出支持xls与xlsx

    jxl2.6以上,excelUtils公共导出支持xls与xlsx两种格式,excelUtils中最后一个方法是excel文件导入例子

    ExcelUtils.rar

    java poi实现的excel工具类处理excel中表格的数据转化成List对象集合或者将业务数据列表转化成excle表格数据,是一个很好用的excelUtils工具很轻直接导入到你的项目,修改包名,加载相关依赖就能使用啦,功能很完整...

    excelutils-1.41.jar

    ExcelUtils代表着一类的报表生成工具,他使用报表本身作为模板。对于它,只能处理Excel文件,它以Excel文件为模板,在其上加以自己的定义语言,简单通俗! 官方主页:...

    ExcelUtils 工具类

    用于数据库数据导出到Excel表的java工具类,适合多种格式

    util_ExcelUtils工具类_

    Excel工具类,操作Excel文件,读取文件中的信息,写入生成excel文件

    excelUtils.zip

    这是导出excel的一个工具类,仅供学习使用,如真实开发环境使用此工具类出现问题,这里不负责!可以通过这个工具类学习简单的poi导出excel操作,也可以比着自己实现一个自己的工具类,毕竟用自己的才安全放心。

    excelUtils

    针对excel的上传表格进行处理,poi文件上传-controller层面

Global site tag (gtag.js) - Google Analytics