javaPoi操作csv xlsx


区别:

用JavaPOI导出Excel时,我们会考虑到Excel版本及数据量的问题。针对不同的Excel版本,要采用不同的工具类。
HSSFWorkbook:是操作Excel2003以前(包括2003)的版本,扩展名是.xls;
XSSFWorkbook:是操作Excel2007的版本,扩展名是.xlsx;
对于不同版本的EXCEL文档要使用不同的工具类,如果使用错了,会提示如下错误信息。
org.apache.poi.openxml4j.exceptions.InvalidOperationException
org.apache.poi.poifs.filesystem.OfficeXmlFileException
从POI 3.8版本开始,提供了一种基于XSSF的低内存占用的API----SXSSF
当数据量超出65536条后,在使用HSSFWorkbook或XSSFWorkbook,程序会报OutOfMemoryError:Javaheap space;内存溢出错误。这时应该用SXSSFworkbook。

读取xlsx内容

package test;

import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class read {
    public static void main(String[] args) throws IOException {
        String name= "testa.xlsx";
        //创建输入流
        InputStream is=new FileInputStream(name);
        //创建工作簿
        XSSFWorkbook hb=new XSSFWorkbook(is);
        //获取sheet页
        XSSFSheet xh=hb.getSheet("xx");
        //xh.getLastRowNum() 得到总行数
        System.out.println("sheet行数:"+xh.getLastRowNum());
        //xh.getRow(0) 获得0行 getCell(0) 0列数据 即第一个单元格
        System.out.println(xh.getRow(0).getCell(0));
    }
}

向xlsx写入内容

package test;

import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.xssf.usermodel.*;
import java.io.*;

public class write {
    public static void main(String[] args) throws IOException {
        //创建一个工作簿
        XSSFWorkbook workbook = new XSSFWorkbook();
        //创建sheet页
        XSSFSheet sheet = workbook.createSheet("test");
        //创建工作簿样式
//        sheet.setDefaultRowHeight((short)(20 *256));
        //设置第一列 第二列 宽度 即你要的宽度 * 256
        sheet.setColumnWidth(0,50 * 256);
        sheet.setColumnWidth(1,20 * 256);
        //创建XSSFCellStyle 格式
        XSSFCellStyle cellStyle = workbook.createCellStyle();
        //设置填充背景颜色
        cellStyle.setFillForegroundColor(IndexedColors.BLUE.getIndex());
        //设置填充模式
        cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
       //字体样式 创建字体对象XSSFFont
        XSSFFont xssfFont = workbook.createFont();
        xssfFont.setFontName("楷体");
        //向单元格设置以上设置的属性
        cellStyle.setFont(xssfFont);
        //以下是正题向文件中写入数据 是向xlsx文件 不是csv(csv是以逗号分隔的)
        //创建行
        XSSFRow row = sheet.createRow(0);
        row.setHeight((short)(30*20));
        //创建单元格
        XSSFCell cell = row.createCell(0);
        XSSFCell cell1 = row.createCell(1);
        //设置值
        cell.setCellValue("hah");
        cell1.setCellValue("hello");
        cell.setCellStyle(cellStyle);
        cell1.setCellStyle(cellStyle);
        //创建输出流
        FileOutputStream outputStream = new FileOutputStream("F:\\学习\\test\\write.xlsx");
        workbook.write(outputStream);
        outputStream.flush();
        outputStream.close();
        System.out.println("写入完成");
    }
    }

下面是自己实际运用到的例子

实现内容:

javaPoi 利用CsvReader先从csv文件读取数据 再用XSSFWorkbook向xlsx文件写入数据,代码里面设置了单元格属性(居中,字体大小,宽度 ,高度等)及向xlsx写入过程中科学计数法等相关问题解决

package test;

import com.csvreader.CsvReader;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.xssf.usermodel.*;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class smallfile {
    String ALL = "F:\\学习\\test\\wenj\\all_1000.xlsx";
    String csv[]={"F:\\学习\\test\\wenj\\ghbb_1000.csv","F:\\学习\\test\\wenj\\bonc_zhfk_1000.CSV"};
    //第一行的名称
    String [] first_row = {"库名","表名","表属性(内部外部)","文件总数(个)","块总数(个)","文件总大小(单位byte)","文件大小平均值(单位byte)"};
    //列的宽度
    Integer [] cloumn_width={12,44,26,20,17,30,35};
    String [] sheetNames={"GHBB","BONC_ZHFK"};
    public static void main(String[] args) throws IOException {
        String BSS = "F:\\学习\\test\\wenj\\bss_1000.csv";
        String BONC_ZHFK = "F:\\学习\\test\\wenj\\bonc_zhfk_1000.CSV";
        //创建工作簿
        smallfile smallfile = new smallfile();
        XSSFWorkbook workbook = new XSSFWorkbook();
        XSSFDataFormat dataFormat=workbook.createDataFormat();
        XSSFCellStyle cellStyle = smallfile.setCenter(workbook);
        System.out.println("cellStyle:"+cellStyle.getVerticalAlignmentEnum());
        System.out.println("cellStyle:"+cellStyle.getVerticalAlignmentEnum());
        //创建sheet页
        int sheetIndex=0;
        for (String sheetName : smallfile.sheetNames) {
            //创建sheet页
            System.out.println("-----创建sheet页--------:"+sheetName);
            XSSFSheet sheet = smallfile.setSheet(workbook, sheetName);
            //开始读取数据(csv文件)
            //创建csv读取对象
            CsvReader csvReader = new CsvReader(smallfile.csv[sheetIndex]);
            //跳过读取表头
            boolean headers = csvReader.readHeaders();
            //读取的行数
            int num = 0;
            //定义字段类型
            String db_name = null;
            String table_name = null;
            String tbl_type = null;
            Object file_nums = null;
            Object blockcounts = null;
            Object filesizes = null;
            Object avg_filesizes = null;
            while (csvReader.readRecord()) {
                //创建行
                XSSFRow row = sheet.createRow(num);
                if (csvReader.get(6)!=null && !csvReader.get(5).equals("") && num>0) {
                    db_name = csvReader.get(0);
                    table_name = csvReader.get(1);
                    tbl_type = csvReader.get(2);
//                    System.out.println("num:"+num);
                    file_nums = Double.parseDouble(csvReader.get(3));
                    blockcounts = Double.parseDouble(csvReader.get(4));
                    filesizes = Double.parseDouble(csvReader.get(5));
                    avg_filesizes = Double.parseDouble(csvReader.get(6));
                    List list = new ArrayList<Object>();
                    list.add(db_name);
                    list.add(table_name);
                    list.add(tbl_type);
                    list.add(file_nums);
                    list.add(blockcounts);
                    list.add(filesizes);
                    list.add(avg_filesizes);
                    if (list.size() == 7) {
                        //将读取的数据 向all_1000.xlsl文件中写入
                        for (int i = 0; i < 7; i++) {
                            smallfile.insertCell(row, i, list.get(i),cellStyle,dataFormat);
                        }
                        smallfile.flushDate(workbook);
                    }
                }
                else if (num==0){
                    //num=0时候
                    for (int i = 0; i < 7; i++) {
                        //插入表头第一行
                        smallfile.setFirstRow(row,i,num,cellStyle);
                    }
                    smallfile.flushDate(workbook);
                }
                num += 1;
            }
            sheetIndex++;
        }
    }
//设置第一行单元格内容
    public void setFirstRow(XSSFRow row,int i,int num,CellStyle cellStyle){
        //设置高度
        row.setHeight((short)(30*20));
        XSSFCell cell = row.createCell(i);
        //设置第一行内容
        cell.setCellValue(first_row[i]);
        cell.setCellStyle(cellStyle);
    }
    //设置样式居中
    public XSSFCellStyle setCenter(XSSFWorkbook workbook){
        XSSFCellStyle cellStyle=workbook.createCellStyle();
        //设置垂直居中
//        cellStyle.setFillForegroundColor(IndexedColors.BLUE.getIndex());
        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
        //设置水平居中
        cellStyle.setAlignment(HorizontalAlignment.CENTER);
        System.out.println(cellStyle.getVerticalAlignmentEnum()+"<>"+cellStyle.getAlignmentEnum());
        return cellStyle;
    }
//想单元格插入数据
    public void insertCell(XSSFRow row, int i, Object value,CellStyle cellStyle,XSSFDataFormat dataFormat) {
        XSSFCell rowCell = row.createCell(i);
        if (i >= 3) {
            cellStyle.setDataFormat(dataFormat.getFormat("0.00"));
            String val=""+Double.parseDouble(value.toString());
            System.out.println("val:"+val);
            if (val.matches(".*E.*")){
                String [] tmp_n=val.split("E");
                System.out.println(tmp_n[0]+"<>"+tmp_n[1]);
                String jjj=""+Double.parseDouble(tmp_n[0])*Math.pow(10,Double.parseDouble(tmp_n[1]));
                System.out.println("jjj:"+jjj);
            }
            rowCell.setCellValue(Double.parseDouble(value.toString()));
            System.out.println("i>=3 value:"+Double.parseDouble(value.toString()));
            //当大于3说明 操作是exel后面4个列 转换为double
        } else {
            rowCell.setCellValue(value.toString());
        }
        rowCell.setCellStyle(cellStyle);
    }

//flush数据到工作簿
    public void flushDate(XSSFWorkbook workbook) throws IOException {
        FileOutputStream outputStream = new FileOutputStream(ALL);
        workbook.write(outputStream);
        outputStream.flush();
        outputStream.close();
    }
    //设置列的宽度
    public void setCloumn_width(XSSFSheet sheet){
        int i=0;
        for (Integer integer : cloumn_width) {
            sheet.setColumnWidth(i, integer * 256);
            i++;
        }
    }
    //创建sheet页
    public XSSFSheet setSheet(XSSFWorkbook workbook,String sheetname){
        //创建bss  sheet页
        XSSFSheet sheet = workbook.createSheet(sheetname);
        //设置列的宽度
        setCloumn_width(sheet);
        return sheet;
    }
}