学会简单使用poi进行excel有关操作

直接上代码:

官网上的抄的api例子:

package com.test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Calendar;
import java.util.Date;

import org.apache.poi.EncryptedDocumentException;
import org.apache.poi.hssf.extractor.ExcelExtractor;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.usermodel.HeaderFooter;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.poifs.filesystem.NPOIFSFileSystem;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.CreationHelper;
import org.apache.poi.ss.usermodel.DataFormat;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.Footer;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.PrintSetup;
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.usermodel.WorkbookFactory;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.ss.util.CellReference;
import org.apache.poi.ss.util.CellUtil;
import org.apache.poi.ss.util.RegionUtil;
import org.apache.poi.ss.util.WorkbookUtil;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFColor;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.junit.Test;

/**
 * 根据api一些简单操作
 * @author Administrator
 *
 */
public class CreateExcel {
    String str="C:\Users\Administrator.PMIMP83HWNIKWOV\Desktop\poi\create workbook";
    public static void main(String[] args) {
        CreateExcel ce=new CreateExcel();
//        String str="C:\Users\Administrator.PMIMP83HWNIKWOV\Desktop\poi\create workbook";
//        ce.createSheet(new HSSFWorkbook(), str+"\demo0.xls");
//        ce.createCell();
        ce.createDateCell();
    }
    
    /**
     * 创建Workbook
     */
    public void createWorkbook(){
        
        Workbook wb=null;
        FileOutputStream fileOut=null;
        try {
            wb=new HSSFWorkbook();
            fileOut=new FileOutputStream(str+"\demo.xls");
            wb.write(fileOut);
            fileOut.close();
            
            wb=new XSSFWorkbook();
            fileOut=new FileOutputStream(str+"\demo1.xlsx");
            wb.write(fileOut);
            fileOut.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    //建表,不要问我为什么注释有些是英文的,官网上扣下来的
    public void createSheet(Workbook wb,String filename){
        Sheet sheet1=wb.createSheet("sheet1");
        // Note that sheet name is Excel must not exceed 31 characters
        // and must not contain any of the any of the following characters:
        // 0x0000
        // 0x0003
        // colon (:)
        // backslash ()
        // asterisk (*)
        // question mark (?)
        // forward slash (/)
        // opening square bracket ([)
        // closing square bracket (])

        // You can use org.apache.poi.ss.util.WorkbookUtil#createSafeSheetName(String nameProposal)}
        // for a safe way to create valid names, this utility replaces invalid characters with a space (' ')
        
        String safeName=WorkbookUtil.createSafeSheetName("[O'Briend's sales*?]");//这个方法会去除名称字符串中的不合法字符
        Sheet sheet3=wb.createSheet(safeName);
        try {
            FileOutputStream fileOut=new FileOutputStream(filename, true);
            wb.write(fileOut);
            fileOut.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    /**
     * 创建细胞,也就是创建格子
     */
    public void createCell(){
        Workbook wb=new HSSFWorkbook();//xsl
        //Workbook wb=new XSSFWorkbook();
        CreationHelper createHelper=wb.getCreationHelper();
        Sheet sheet=wb.createSheet("sheet3");
        
        //create a row and put some cells in it.Rows are 0 based
        Row row=sheet.createRow((short)0);
        //create a cell and put a value in it
        Cell cell=row.createCell(0);//不填写类型的话,默认的类型是this.createCell(column,HSSFCell.CELL_TYPE_BLANK);
        cell.setCellValue(1);
        
        //or do it on one line
        row.createCell(1).setCellValue(1.2);//创建和赋值连成一行
        row.createCell(2).setCellValue(createHelper.createRichTextString("This is a string"));
        row.createCell(3).setCellValue(true);
        row.createCell(4).setCellValue("nihao");
        
        //write the output to a file
        try {
            
            FileOutputStream fileOut=new FileOutputStream("C:\Users\Administrator.PMIMP83HWNIKWOV\Desktop\poi\create workbook\demo.xls",true);
            wb.write(fileOut);
            fileOut.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    //创建日期类型cell
    public void createDateCell(){
        Workbook wb=new HSSFWorkbook();
        //Workbook wb=new XSSFWorkbook();
        CreationHelper createHelper=wb.getCreationHelper();
        Sheet sheet=wb.createSheet("new sheet");
        
        Row row=sheet.createRow(0);
        //create a row and put a date value in it.The first cell is not styled as a date.
        Cell cell=row.createCell(0);
        cell.setCellValue(new Date());
        
        //we style the second cell as a date (and time).It is important to create a new 
        //cell style from the workbook oterwise you can end up modifying the builting in style and effecting not only this cell but other cells
        //设置日期的格式是分厂重要的
        CellStyle cellStyle=wb.createCellStyle();
        cellStyle.setDataFormat(
                createHelper.createDataFormat().getFormat("m/d/yy h:mm")
        )    ;
        cell=row.createCell(1);
        cell.setCellValue(new Date());
        cell.setCellStyle(cellStyle);
        
        //write the output to a file
        FileOutputStream fileOut;
        try {
            
            fileOut = new FileOutputStream(str+"\demo4.xls");
            wb.write(fileOut);
            fileOut.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        
    }
    
    //使用不同类型的cell
    @Test
    public void useOtherTypeCell(){
        Workbook wb=new HSSFWorkbook();
        Sheet sheet=wb.createSheet("new sheet");
        Row row=sheet.createRow((short)2);
        row.createCell(0).setCellValue(1.1);
        row.createCell(1).setCellValue(new Date());
        row.createCell(2).setCellValue(Calendar.getInstance());
        row.createCell(3).setCellValue("a string");
        row.createCell(4).setCellValue(true);
        row.createCell(5).setCellType(Cell.CELL_TYPE_ERROR);
        
        //write the output to a file
        FileOutputStream fileOut;
        try {
            
            fileOut = new FileOutputStream(str+"\demo5.xls");
            wb.write(fileOut);
            fileOut.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    //文件VS输入流
    @Test
    public void FileVSStream(){
        //打开工作薄时,要么.xsl HSSFWorkbook或.xlsx XSSFWorkbook,可以从一个工作薄 文件 或者一个InputStream,使用一个文件对象允许更低的
        //内存消耗,而一个InputStream需要更多的内存缓冲区
        
        //使用WorkbookFactory获取Workbook
        try {
            Workbook wb=WorkbookFactory.create(new File(str+"\MyExcel.xlsx"));
        } catch (EncryptedDocumentException e) {
            e.printStackTrace();
        } catch (InvalidFormatException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        
        //使用InputStream获取Workbook对象
        try {
            Workbook wb=WorkbookFactory.create(new FileInputStream(str+"\MyExcel.xlsx"));
            
        } catch (EncryptedDocumentException e) {
            e.printStackTrace();
        } catch (InvalidFormatException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        
        //如果使用HSSFWorkbook或者XSSFWorkbook直接,通常应该使用NPOIFSFileSystem或OPCPackage 有完全控制的生命周期(包括完成后关闭该文件)
        try {
            NPOIFSFileSystem fs=new NPOIFSFileSystem(new File(str+"\MyExcel.xls"));
            HSSFWorkbook wb=new HSSFWorkbook(fs.getRoot(),true);
            //...
            fs.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            NPOIFSFileSystem fs=new NPOIFSFileSystem(new FileInputStream(str+"\MyExcel.xls"));
            HSSFWorkbook wb=new HSSFWorkbook(fs.getRoot(),true);
            //...
            fs.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        //XXSFWorkbook
        try {
            OPCPackage pkg=OPCPackage.open(new File(str+"\MyExcel.xlsx"));
            XSSFWorkbook wb=new XSSFWorkbook(pkg);
            //...
            pkg.close();
        } catch (InvalidFormatException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            OPCPackage pkg=OPCPackage.open(new FileInputStream(str+"\MyExcel.xlsx"));
            XSSFWorkbook wb=new XSSFWorkbook(pkg);
            //...
            pkg.close();
        } catch (InvalidFormatException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    //演示各种对齐选项
    @Test
    public void alignTest(){
        Workbook wb=new XSSFWorkbook();
        
        Sheet sheet=wb.createSheet();
        Row row=sheet.createRow((short)2);
        row.setHeightInPoints(30);//设置行高
        
        createCell(wb,row,(short)0,CellStyle.ALIGN_CENTER,CellStyle.VERTICAL_BOTTOM);
        createCell(wb,row,(short)1,CellStyle.ALIGN_CENTER_SELECTION,CellStyle.VERTICAL_BOTTOM);
        createCell(wb,row,(short)2,CellStyle.ALIGN_FILL,CellStyle.VERTICAL_CENTER);
        createCell(wb,row,(short)3,CellStyle.ALIGN_GENERAL, CellStyle.VERTICAL_CENTER);
        createCell(wb, row, (short) 4, CellStyle.ALIGN_JUSTIFY, CellStyle.VERTICAL_JUSTIFY);
        createCell(wb, row, (short) 5, CellStyle.ALIGN_LEFT, CellStyle.VERTICAL_TOP);
        createCell(wb, row, (short) 6, CellStyle.ALIGN_RIGHT, CellStyle.VERTICAL_TOP);
        
        //write the output to a file
        FileOutputStream fileOut;
        try {
            fileOut = new FileOutputStream(str+"\xssf-align.xlsx");
             wb.write(fileOut);
             fileOut.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
       
    }
    public void createCell(Workbook wb,Row row,short column,short halign,short valign){
        Cell cell=row.createCell(column);
        cell.setCellValue("Align It");
        CellStyle cellStyle=wb.createCellStyle();
        cellStyle.setAlignment(halign);
        cellStyle.setVerticalAlignment(valign);
        cell.setCellStyle(cellStyle);
    }
    
    //使用边界
    @Test
    public void usrBorder(){
        Workbook wb=new HSSFWorkbook();
        Sheet sheet=wb.createSheet("new sheet");
        
        Row row=sheet.createRow(1);
        
        Cell cell=row.createCell(1);
        cell.setCellValue(4);
        
        //style the cell with borders all around
        CellStyle style=wb.createCellStyle();
        style.setBorderBottom(CellStyle.BORDER_THIN);
        style.setBottomBorderColor(IndexedColors.BLACK.getIndex());
        style.setBorderLeft(CellStyle.BORDER_THIN);
        style.setLeftBorderColor(IndexedColors.GREEN.getIndex());
        style.setBorderRight(CellStyle.BORDER_THIN);
        style.setRightBorderColor(IndexedColors.BLUE.getIndex());
        style.setBorderTop(CellStyle.BORDER_MEDIUM_DASHED);
        style.setTopBorderColor(IndexedColors.BLACK.getIndex());
        cell.setCellStyle(style);
        
        FileOutputStream fileOut;
        try {
            fileOut = new FileOutputStream(str+"\demo7.xls");
             wb.write(fileOut);
             fileOut.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
    
    @Test
    public void IteratorRowAndCell(){
        //有时候,你想遍历workbook,一个表中的所有行或者所有的cell
        /*
         *workbook.sheetIterator(),sheet.rowIterator(),row.cellIterator() ,或者隐式地使用forEach
         *注意使用迭代器等遍历注意间隔和空缝隙
         */
    }
    
    public void IteratorWhiteCell(Sheet sheet){
        int rowStart=Math.min(15,sheet.getFirstRowNum());
        int rowEnd=Math.max(1400, sheet.getLastRowNum());
        
        for(int rowNum=rowStart;rowNum<rowEnd;rowNum++){
            Row r=sheet.getRow(rowNum);
            if(r==null){
                //这行是空的
                continue;
            }
            int lastColumn=r.getLastCellNum();
            for(int cn=0;cn<lastColumn;cn++){
                Cell c=r.getCell(cn, Row.RETURN_BLANK_AS_NULL);
                if(c==null){
                    //the spreadsheet is empty in this cell
                }else{
                    //Do something useful with the cell's contents
                }
            }
        }
    }
    //获取单元格内容
    /*
     *To get the contents of a cell,you first need to know what kind of the cell is(asking a string cell for its numeric will
     *ge you a NumberFormatException for example)
     *
     * 得到单元格内容,你首先需要知道它是什么类型,否则错误的类型可能会出现NumberFormatException
     */
    @Test
    public void getContent(){
        Workbook wb=null;
        try {
            wb = new XSSFWorkbook(new File(str+"\订餐统计.xlsx"));
        } catch (InvalidFormatException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        Sheet sheet1=wb.getSheetAt(0);
        for(Row row:sheet1){
            for(Cell cell:row){
                CellReference cellRef=new CellReference(row.getRowNum(),cell.getColumnIndex());
                System.out.print(cellRef.formatAsString());
                System.out.println(" - ");
                
                switch(cell.getCellType()){
                case Cell.CELL_TYPE_STRING:
                    System.out.println(cell.getRichStringCellValue().getString());
                    break;
                case Cell.CELL_TYPE_NUMERIC:
                    if(DateUtil.isCellDateFormatted(cell)){
                        System.out.println(cell.getDateCellValue());
                    }else{
                        System.out.println(cell.getNumericCellValue());
                    }
                    break;
                case Cell.CELL_TYPE_BOOLEAN:
                    System.out.println(cell.getBooleanCellValue());
                    break;
                case Cell.CELL_TYPE_FORMULA:
                    System.out.println(cell.getBooleanCellValue());
                    break;
                default:
                    System.out.println();
                }
            }
        }
        
    }
    
    //文本提取
    //对于大多数文本提取要求
    @Test
    public void getText(){
        InputStream inp=null;
        HSSFWorkbook wb=null;
        try {
            inp = new FileInputStream(str+"\demo.xls");
            wb=new HSSFWorkbook(new POIFSFileSystem(inp));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        
        ExcelExtractor extractor=new ExcelExtractor(wb);
        
        extractor.setFormulasNotResults(true);
        extractor.setIncludeSheetNames(false);
        String text=extractor.getText();
        System.out.println(text);
    }
    
    //填充和颜色
    @Test
    public void paddingAndColor(){
        Workbook wb=new XSSFWorkbook();
        Sheet sheet=wb.createSheet("new sheet");
        
        //create a row and put some cells in it.Row are 0 based
        Row row=sheet.createRow((short)1);
        
        //Aqua background  aqua:浅绿色
        CellStyle style=wb.createCellStyle();
        style.setFillBackgroundColor(IndexedColors.AQUA.getIndex());
        style.setFillPattern(CellStyle.BIG_SPOTS);
        Cell cell=row.createCell((short)1);
        cell.setCellValue("X");
        cell.setCellStyle(style);
        
        //Orange "foreground",foreground beging the fill foreground not the font color . foreground:前景
        style=wb.createCellStyle();
        style.setFillForegroundColor(IndexedColors.ORANGE.getIndex());
        style.setFillPattern(CellStyle.SOLID_FOREGROUND);
        cell=row.createCell((short)2);
        cell.setCellValue("X");
        cell.setCellStyle(style);
        
        //write to output to a file
         FileOutputStream fileOut;
            try {
                fileOut = new FileOutputStream(str+"\demo8.xlsx");
                 wb.write(fileOut);
                 fileOut.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
    }
    
    //合并单元格
    @Test
    public void combineCell(){
        Workbook wb=new HSSFWorkbook();
        Sheet sheet=wb.createSheet("new sheet");
        
        Row row=sheet.createRow((short)1);
        Cell cell=row.createCell((short)1);
        cell.setCellValue("this is a test of merging");
        
        sheet.addMergedRegion(new CellRangeAddress(
            1, //    firstRow, 全部从0为基数
            1, //    lastRow,
            1,//    firstCol,
            2//    lastCol
            ));
        
        FileOutputStream fileOut;
        try {
            fileOut = new FileOutputStream(str+"\demo9.xls");
             wb.write(fileOut);
             fileOut.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    //设置字体
    @Test
    public void useFont(){
        Workbook wb=new HSSFWorkbook();
        Sheet sheet=wb.createSheet("new sheet");
        
        Row row=sheet.createRow(1);
        
        //create a new font and alert it
        Font font=wb.createFont();
        font.setFontHeight((short)24);
        font.setFontName("Courier New");
        font.setItalic(true);
        font.setStrikeout(true);
        
        CellStyle style=wb.createCellStyle();
        style.setFont(font);
        Cell cell=row.createCell(1);
        cell.setCellValue("This is a test of fonts");
        cell.setCellStyle(style);
        
        FileOutputStream fileOut;
        try {
            fileOut = new FileOutputStream(str+"\demo10.xls");
             wb.write(fileOut);
             fileOut.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        //Note ,the maximun number of unique fonts in a workbooks is limited 32767,you should reuse fonts in you applications
        //instead of creating a font for each cell
        //在一个workbook中,每一个font是唯一的,好像在32767之内。你应该使用同一个Font然后循环给单元格设置样式而不是在循环中初始化多个font
        
        /*//错误的:
        for(int i=0;i<10000;i++){
            row=sheet.createRow(i);
            cell=row.createCell((short)0);
            
            style=wb.createCellStyle();
            font=wb.createFont();
            font.setBoldweight(Font.BOLDWEIGHT_BOLD);
            style.setFont(font);
            cell.setCellStyle(style);
        }
        //正确的:
        style=wb.createCellStyle();
        font=wb.createFont();
        font.setBoldweight(Font.BOLDWEIGHT_BOLD);
        style.setFont(font);
        for(int i=0;i<10000;i++){
            row=sheet.createRow(i);
            cell=row.createCell((short)0);
            cell.setCellStyle(style);
        }*/
    }
    
    //自定义颜色
    @Test
    public  void customColor(){
//        //HSSF中
//        HSSFWorkbook wb=new HSSFWorkbook();
//        HSSFSheet sheet=wb.createSheet();
//        HSSFRow row=sheet.createRow((short)0);
//        @SuppressWarnings("deprecation")
//        HSSFCell cell=row.createCell((short)0);
//        cell.setCellValue("Default Palette");
//        
//        //apply some colors from the standard palette,as in the previous examples
//        //we will use red text on a lime background
//        HSSFCellStyle style=wb.createCellStyle();
//        style.setFillForegroundColor(HSSFColor.LIME.index);
//        style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
//        
//        HSSFFont font=wb.createFont();
//        font.setColor(HSSFColor.RED.index);//字体颜色
//        style.setFont(font);
//        
//        cell.setCellStyle(style);
//        
//        //save with the default palette
//        try {
//            FileOutputStream out=new FileOutputStream(str+"\default_patte.xls");
//            wb.write(out);
//            wb.close();
//        } catch (FileNotFoundException e) {
//            e.printStackTrace();
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//        
//        //now let's replace RED and LIMIT in the palette with a more attractive combination
//        //(lovingly borrowed from freebsd.org)
//        cell.setCellValue("Modified Palette");
//        
//        //creating a custom palette for the workbook
//        HSSFPalette palette=wb.getCustomPalette();
//        
//        //replacing the standard red with freebsd.org red
//        palette.setColorAtIndex(HSSFColor.LIME.index,
//                (byte) 153,//red,
//                (byte) 0,//green,
//                (byte) 0//blue
//            );
//        //replacing lime with freebsd.org gold
//        palette.setColorAtIndex(HSSFColor.LIME.index, (byte)255, (byte)204, (byte)102);
//        
//        //save with the modified palette
//        //note that wherever we have previously used RED or LIME,the new colors magically appear
//        try {
//            FileOutputStream out=new FileOutputStream(str+"\modified_palette.xls");
//            wb.write(out);
//            out.close();
//        } catch (FileNotFoundException e) {
//            e.printStackTrace();
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//        
        //在XSSF中
        XSSFWorkbook wb1=new XSSFWorkbook();
        XSSFSheet sheet1=wb1.createSheet();
        XSSFRow row1=sheet1.createRow(0);
        XSSFCell cell1=row1.createCell(0);
        cell1.setCellValue("custom XSSF colors");
        
        XSSFCellStyle style1=wb1.createCellStyle();
        style1.setFillForegroundColor(new XSSFColor(new java.awt.Color(128,0,128)));//设置背景颜色
        style1.setFillPattern(CellStyle.SOLID_FOREGROUND);
        cell1.setCellStyle(style1);
        try {
            FileOutputStream out=new FileOutputStream(str+"\modified_palette1.xlsx");
            wb1.write(out);
            out.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    } 
    //读和修改
    @Test
    public void readAndRewrite(){
        try {
            InputStream inp=new FileInputStream(str+"\cs.xlsx");
            //InputStream inp=new FileInputStream("workbook.xlsx");
            
            Workbook wb=WorkbookFactory.create(inp);
            Sheet sheet=wb.getSheetAt(0);
            Row row=sheet.getRow(2);
            Cell cell=row.getCell(3);
            if(cell==null){
                cell=row.createCell(3);
            }
            cell.setCellType(Cell.CELL_TYPE_STRING);
            cell.setCellValue("a test");
            
            FileOutputStream fileOut=new FileOutputStream(str+"\cs.xlsx");
            wb.write(fileOut);
            fileOut.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (EncryptedDocumentException e) {
            e.printStackTrace();
        } catch (InvalidFormatException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    //在单元格内使用文本换行
    @Test
    public void useNewLine(){
        Workbook wb=new XSSFWorkbook();//or new HSSFWorkbook();
        Sheet sheet=wb.createSheet();
        
        Row row=sheet.createRow(2);
        Cell cell=row.createCell(2);
        cell.setCellValue("use 
 with word warp on to create a new line");
        
        //to enable newlines you need set a cell styles with warp==true
        CellStyle cs=wb.createCellStyle();
        cs.setWrapText(true);
        cell.setCellStyle(cs);
        
        //increase row height to accomodate two lines of text
        //设置行高为两个行高
        row.setHeightInPoints(2*sheet.getDefaultRowHeightInPoints());
        
        //adjust column width to fit the content
        sheet.autoSizeColumn((short)2);
        
        FileOutputStream fileOut;
        try {
            fileOut = new FileOutputStream(str+"\ooxml-newlines.xlsx");
            wb.write(fileOut);
            fileOut.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        
    }
    
    //数据格式
    @Test
    public void formatData(){
        Workbook wb=new HSSFWorkbook();
        Sheet sheet=wb.createSheet("format sheet");
        CellStyle style;
        DataFormat format=wb.createDataFormat();
        Row row;
        Cell cell;
        short rowNum=0;
        short colNum=0;
        
        row=sheet.createRow(rowNum++);
        cell=row.createCell(colNum);
        cell.setCellValue(11111.25);
        style=wb.createCellStyle();
        style.setDataFormat(format.getFormat("0.0"));
        cell.setCellStyle(style);
        
        row=sheet.createRow(rowNum++);
        cell=row.createCell(colNum);
        cell.setCellValue(11111.25);
        style=wb.createCellStyle();
        style.setDataFormat(format.getFormat("#,##0.0000"));
        cell.setCellStyle(style);

        FileOutputStream fileOut;
        try {
            fileOut = new FileOutputStream(str+"\demo11.xls");
            wb.write(fileOut);
            fileOut.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        
    }
    //有道翻译感觉不太准确
    //Fix Sheet to One Page
    @Test
    public void fixToOnePage(){
        Workbook wb=new HSSFWorkbook();
        Sheet sheet=wb.createSheet("format sheet");
        PrintSetup ps=sheet.getPrintSetup();
        
        sheet.setAutobreaks(true);
        
        ps.setFitHeight((short)1);
        ps.setFitWidth((short)1);
        
        //create various cells and rows for spreadsheet
        Row row=sheet.createRow(1);
        Cell cell=row.createCell(0);
        cell.setCellValue("nihao");
        FileOutputStream fileOut;
        try {
            fileOut = new FileOutputStream(str+"\demo12.xls");
            wb.write(fileOut);
            fileOut.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    //Set Print Area 设置打印区域
    @Test
    public void setPrintArea(){//其实我感觉不出什么东西来,不过api上有就写一下
        Workbook wb=new HSSFWorkbook();
        Sheet sheet=wb.createSheet("sheet1");
        //sets the print area for the first sheet
        wb.setPrintArea(0, "$A$1:$C$2");
        
        //Alternatibely
        wb.setPrintArea(
                0,//sheetIndex,
                0,//startColumn,
                0,//endColumn,
                0,//startRow,
                0//endRow
            );
        FileOutputStream fileOut;
        try {
            fileOut = new FileOutputStream(str+"\demo13.xls");
            wb.write(fileOut);
            fileOut.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    //Set Page Numbers on Footer
    @Test
    public void setFooter(){
        Workbook wb=new HSSFWorkbook();//or new XSSFWorkbook();
        Sheet sheet=wb.createSheet("format sheet");
        Footer footer=sheet.getFooter();
        footer.setRight("Page "+HeaderFooter.page()+" of "+HeaderFooter.numPages());
        
        //Create various cells and rows for spreadsheet
        Row row=sheet.createRow(1);
        Cell cell=row.createCell(0);
        cell.setCellValue("haha");
        FileOutputStream fileOut;
        try {
            fileOut = new FileOutputStream(str+"\demo14.xls");
            wb.write(fileOut);
            fileOut.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        
    }
    
    //使用一些函数
    @Test
    public void useSomeFunction(){
        Workbook wb=new HSSFWorkbook();//new XSSFWorkbook();
        Sheet sheet1=wb.createSheet("new sheet");
        
        //create a merged region 合并区域
        Row row=sheet1.createRow(1);
        Row row2=sheet1.createRow(2);
        Cell cell=row.createCell(1);
        cell.setCellValue("This is a test of merging");
        CellRangeAddress region=CellRangeAddress.valueOf("B2:E5");
        sheet1.addMergedRegion(region);
        
        //Set the border and border colors
        final short borderMediumDashed=CellStyle.BORDER_MEDIUM_DASHED;
        RegionUtil.setBorderTop(borderMediumDashed, region, sheet1, wb);
        RegionUtil.setBorderLeft(borderMediumDashed, region, sheet1, wb);
        RegionUtil.setBorderBottom(borderMediumDashed, region, sheet1, wb);
        RegionUtil.setRightBorderColor(borderMediumDashed, region, sheet1, wb);
        RegionUtil.setBottomBorderColor(IndexedColors.AQUA.getIndex(), region, sheet1, wb);
        RegionUtil.setTopBorderColor(IndexedColors.AQUA.getIndex(), region, sheet1, wb);
        RegionUtil.setRightBorderColor(IndexedColors.AQUA.getIndex(), region, sheet1, wb);
        RegionUtil.setLeftBorderColor(IndexedColors.AQUA.getIndex(), region, sheet1, wb);
        
        //shows some usages of HSSFCellUtil
        CellStyle style=wb.createCellStyle();
        style.setIndention((short)4);
        CellUtil.createCell(row, 8, "this is the value of the cell",style);
        Cell cell2=CellUtil.createCell(row2, 8, "this is the value of the cell");
        CellUtil.setAlignment(cell2,wb,CellStyle.ALIGN_CENTER);
        
        //Write out the workbook
        FileOutputStream fileOut;
        try {
            fileOut = new FileOutputStream(str+"\demo15.xls");
            wb.write(fileOut);
            fileOut.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        
    }
    //重复的行和列
    @Test
    public void repeatingRowAndCol(){
        Workbook wb=new HSSFWorkbook();
        Sheet sheet1=wb.createSheet("Sheet1");
        Sheet sheet2=wb.createSheet("Sheet2");
        
        //set the rows to repeat from 4 to 5 on the first sheet
        sheet1.setRepeatingRows(CellRangeAddress.valueOf("4:5"));
        //set the columns to repeat from column A to C on the secend sheet
        sheet2.setRepeatingColumns(CellRangeAddress.valueOf("A:C"));
        
        FileOutputStream fileOut;
        try {
            fileOut = new FileOutputStream(str+"\demo16.xls");
            wb.write(fileOut);
            fileOut.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    
    
}
View Code

简单解析excel:

package com.test;

import java.io.File;
import java.io.IOException;

import org.apache.poi.EncryptedDocumentException;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Cell;
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.usermodel.WorkbookFactory;
/*
  static int     CELL_TYPE_BLANK
          Blank Cell type (3)
static int     CELL_TYPE_BOOLEAN
          Boolean Cell type (4)
static int     CELL_TYPE_ERROR
          Error Cell type (5)
static int     CELL_TYPE_FORMULA
          Formula Cell type (2)
static int     CELL_TYPE_NUMERIC
          Numeric Cell type (0)
static int     CELL_TYPE_STRING
          String Cell type (1)
 */
public class ParseexcelDemo {
    public static void main(String[] args) {
        ParseexcelDemo pxd=new ParseexcelDemo();
        pxd.parseXml("C:\Users\Administrator.PMIMP83HWNIKWOV\Desktop\poi\create workbook\学员烧烤通讯录表.xlsx");
    }
    public void parseXml(String filename){
        Workbook wb=null;
        try {
            wb=WorkbookFactory.create(new File(filename));
            Sheet sheet=wb.getSheetAt(0);
            
            for(Row row:sheet){
                
                for(Cell cell:row){
                    System.out.print(getCellValue(cell)+"---");
                }
                System.out.println();
            }
        } catch (EncryptedDocumentException e) {
            e.printStackTrace();
        } catch (InvalidFormatException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    public Object getCellValue(Cell cell){
        int type=cell.getCellType();
        String show=null;
        switch(type){
        case Cell.CELL_TYPE_BLANK:
            show=null;break;
        case Cell.CELL_TYPE_BOOLEAN:
            show= String.valueOf(cell.getBooleanCellValue());break;
        case Cell.CELL_TYPE_ERROR:
            show=String.valueOf(cell.getErrorCellValue());break;
        case Cell.CELL_TYPE_FORMULA:
            show=cell.getCellFormula();break;
        case Cell.CELL_TYPE_NUMERIC:
            show=String.valueOf(cell.getNumericCellValue());break;
        case Cell.CELL_TYPE_STRING:
            show=cell.getStringCellValue();break;
        default:
            show=null;
        }
        return show;
    }
}
View Code

简单创建excel:

package com.listenerVedio;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

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.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.junit.Test;

public class PotTest1 {
    @Test
    public void TestWrite01(){
        Workbook wb=new HSSFWorkbook();
        FileOutputStream fos=null;
        try {
            fos=new FileOutputStream("d:/test/poi/w1.xls");
            Sheet sheet=wb.createSheet("测试01");
            Row row=sheet.createRow(0);
            row.setHeightInPoints(30);//设置行高
            CellStyle cs=wb.createCellStyle();//新建单元格样式对象
            //我们可以使用CellStyle设置单元格的一些关于美化方向的属性,比如颜色,边框,背景等
            cs.setAlignment(CellStyle.ALIGN_CENTER);//设置水平居中
            cs.setVerticalAlignment(CellStyle.VERTICAL_CENTER);//设置垂直居中
            /*
            cs.setBorderBottom((short)1);//设置边框样式 这里发现边框设置样式失败。原来设置边框中使用的是样式的常量
            cs.setBorderTop((short)1);
            cs.setBorderLeft((short)1);
            cs.setBorderRight((short)1);
            */
            cs.setBorderBottom(CellStyle.BORDER_DASH_DOT);
            cs.setBorderLeft(CellStyle.BORDER_MEDIUM_DASH_DOT_DOT);
            Cell c=row.createCell(0);
            c.setCellStyle(cs);//给单元格设置样式
            c.setCellValue("标识");
            c=row.createCell(1);
            c.setCellStyle(cs);
            c.setCellValue("用户名");
            wb.write(fos);
            wb.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        
        /**
         * 发现这样写是不现实的,因为设置一个单元格样式太过麻烦。虽然使用for、循环可以达到效果
         * 我 们习惯于创建一个模板,模板里面将样式定好,然后我们填充模板里面的元素,然后用来完成数据的导出
         * 能够根据excel转换成对象,能够将对象导成excel,能够带模板的方式导出excel。终极目标
         *
         * 一些思路:如何将对象导出成excel,首先需要有对象,对象一般不是你的实体类而是专门用来导出的自定义对象,应为导出对象的列应该不是所有的
         * 如何确定顶部的标题:使用注解实现。创建Annotation,在其中说明这是excel的resource,顺序也是使用注解实现
         * 
         */
    }
}
View Code

使用模板简单创建excel:

package com.util;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.RichTextString;
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.usermodel.WorkbookFactory;

/**
 * Excel模板
 * @author Administrator
 *
 */
public class ExcelTemplate {
    private static ExcelTemplate et=new ExcelTemplate();
    public final static String DATA_LINE="datas";
    public final static String DEFAULT_STYLE="defaultStyle";
    public final static String OWNSTYLE="style";
    private Workbook wb;
    private Sheet sheet;
    /**
     * 数据的初始化列
     */
    private int initColIndex;
    /**
     * 数据的初始化行
     */
    private int initRowIndex;
    /**
     * 数据的当前列
     */
    private int curColIndex;
    /**
     * 数据的当前行
     */
    private int curRowIndex;
    /**
     * 数据的最后一行
     */
    private int lastRowIndex;
    /**
     * 当前行对象
     */
    private Row curRow;
    /**
     * 默认样式
     */
    private CellStyle defaultStyle;
    /**
     * 自定义的样式的集合
     */
    private Map<Integer,CellStyle> styles;
    /**
     * 数据列行高
     */
    private float dataLineHeight;
    /**
     * 单例获取et
     * @return
     */
    public static ExcelTemplate getInstance(){
        return et;
    }
    /**
     * 根据classPath读取模板
     * @param classPath
     * @return
     */
    public ExcelTemplate readTemplateByClasspath(String classPath){
        try {
            wb=WorkbookFactory.create(ExcelTemplate.class.getResourceAsStream(classPath));
        } catch (InvalidFormatException e) {
            e.printStackTrace();
            throw new RuntimeException("取读模板格式有误!请检查");
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException("取读的模板不存在!请检查");
        }
        initTemp();
        return et;
    }
    /**
     * 根据filePath读取模板
     * @param filePath
     * @return
     */
    public ExcelTemplate  readTemplateByFilepath(String filePath){
        try {
            wb=WorkbookFactory.create(new File(filePath));
        }catch (InvalidFormatException e) {
            e.printStackTrace();
            throw new RuntimeException("取读模板格式有误!请检查");
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException("取读的模板不存在!请检查");
        }
        initTemp();
        return et;
    }
    /**
     * 将Workbook写入文件
     * @param filePath
     */
    public void writeToFile(String filePath){
        FileOutputStream fos=null;
        try {
            fos=new FileOutputStream(filePath);
            wb.write(fos);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            throw new RuntimeException("写入的文件不存在!"+e.getMessage());
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException("写入数据失败!"+e.getMessage());
        }finally{
            try {
                if(fos!=null){
                    fos.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    /**
     * 将Workbook写入输出流
     * @param os
     */
    public void writeToStream(OutputStream os){
        try {
            wb.write(os);
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException("写入流失败!"+e.getMessage());
        }
    }
    /**
     * 初始化模板
     */
    public void initTemp(){
        sheet=wb.getSheetAt(0);
        initConfigData();
        curRow=sheet.getRow(initRowIndex);
    }
    /**
     * 获取初始化配置数据
     */
    private void initConfigData() {
        lastRowIndex=sheet.getLastRowNum();
        styles=new HashMap<Integer,CellStyle>();
        int styleinRow=0;
        for(Row row:sheet){
            for(Cell cell:row){
                if(cell.getCellType()!=Cell.CELL_TYPE_STRING) continue;
                String str=cell.getStringCellValue().trim();
                if(str.equals(DATA_LINE)){
                    curColIndex=initColIndex=cell.getColumnIndex();
                    curRowIndex=initRowIndex=cell.getRowIndex();
                    dataLineHeight=row.getHeightInPoints();
                }
                if(str.equals(DEFAULT_STYLE)){
                    defaultStyle=cell.getCellStyle();
                    styleinRow=cell.getRowIndex();
                }
                if(str.equals(OWNSTYLE)){
                    styles.put(cell.getColumnIndex(), cell.getCellStyle());
                    styleinRow=cell.getRowIndex();
                }
                
                /**
                 * 后面可以附加好多其他东西
                 */
                
            }
        }
        //sheet.removeRow(sheet.getRow(styleinRow));//这里将设置样式的一行删除,样式已经完成了
        /*直接删除不能实现下面的行自动往上顶,使用移动下面的行将前面的行覆盖实现*/
        sheet.shiftRows(styleinRow+1,lastRowIndex--, -1, true, true);
    }
    /**
     * 创建新行
     */
    public void createNewRow(){
        moveData();
        curRow=sheet.createRow(++curRowIndex);
        curRow.setHeightInPoints(dataLineHeight);
        curColIndex=initColIndex;
    }
    /**
     * 创建新列并为新列赋值
     * @param value
     */
    public void createCell(String value){
        Cell c=curRow.createCell(curColIndex);
        if(styles.containsKey(curColIndex))
            c.setCellStyle(styles.get(curColIndex));
        else
            c.setCellStyle(defaultStyle);
        c.setCellValue(value);
        curColIndex++;
    }
    public void createCell(int value){
        Cell c=curRow.createCell(curColIndex);
        if(styles.containsKey(curColIndex))
            c.setCellStyle(styles.get(curColIndex));
        else
            c.setCellStyle(defaultStyle);
        c.setCellValue(value);
        curColIndex++;
    }
    public void createCell(double value){
        Cell c=curRow.createCell(curColIndex);
        if(styles.containsKey(curColIndex))
            c.setCellStyle(styles.get(curColIndex));
        else
            c.setCellStyle(defaultStyle);
        c.setCellValue(value);
        curColIndex++;
    }
    public void createCell(boolean value){
        Cell c=curRow.createCell(curColIndex);
        if(styles.containsKey(curColIndex))
            c.setCellStyle(styles.get(curColIndex));
        else
            c.setCellStyle(defaultStyle);
        c.setCellValue(value);
        curColIndex++;
    }
    public void createCell(Date value){
        Cell c=curRow.createCell(curColIndex);
        if(styles.containsKey(curColIndex))
            c.setCellStyle(styles.get(curColIndex));
        else
            c.setCellStyle(defaultStyle);
        c.setCellValue(value);
        curColIndex++;
    }
    public void createCell(Calendar value){
        Cell c=curRow.createCell(curColIndex);
        if(styles.containsKey(curColIndex))
            c.setCellStyle(styles.get(curColIndex));
        else
            c.setCellStyle(defaultStyle);
        c.setCellValue(value);
        curColIndex++;
    }
    public void createCell(RichTextString value){
        Cell c=curRow.createCell(curColIndex);
        if(styles.containsKey(curColIndex))
            c.setCellStyle(styles.get(curColIndex));
        else
            c.setCellStyle(defaultStyle);
        c.setCellValue(value);
        curColIndex++;
    }
    
    /**
     * 将excel尾部描述列往后移动
     */
    private void moveData(){
        sheet.shiftRows(curRowIndex+1, lastRowIndex++, 1,true, true);    
    }
    /**
     * 设置序号 可选
     */
    public void insertSerial(){
        int serialRow=-1;
        int serialCol=-1;
        boolean findSerial=false;
        for(Row row:sheet){
            if(findSerial) break;
            for(Cell cell:row){
                if(cell.getCellType()!=Cell.CELL_TYPE_STRING) continue;
                String str=cell.getStringCellValue().trim();
                if(str.equals("serial")){
                    serialRow=cell.getRowIndex();
                    serialCol=cell.getColumnIndex();
                    findSerial=true;
                    break;
                }
            }
        }
        if(serialRow==-1 || serialCol==-1){
            return;
        }
        int count=curRowIndex-initRowIndex+1;
        for(int i=1;i<=count;i++){
            Cell c=sheet.getRow(serialRow++).createCell(serialCol);
            c.setCellValue(i);
        }
    }
    /**
     * 为一些变量赋值
     * @param datas
     */
    public void replaceVariable(Map<String,String> datas){
        for(Row row:sheet){
            for(Cell cell:row){
                if(cell.getCellType()!=Cell.CELL_TYPE_STRING) continue;
                String str=cell.getStringCellValue().trim();
                if(!str.startsWith("#")) continue;
                if(datas.containsKey(str.substring(1))){
                    cell.setCellValue(datas.get(str.substring(1)));
                }
            }
        }
    }
}
View Code

实现excel和对象之间的转换:

package com.ann;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface Column {
    String title();
    int order() default 9999;
}
package com.entity;

import com.ann.Column;
/**
 * 用户类
 * @author Administrator
 *
 */
public class User{
    @Column(title="编号",order=1)
    private int id;
    @Column(title="姓名",order=2)
    private String name;
    @Column(title="年龄",order=3)
    private int age;
    @Column(title="邮箱",order=4)
    private String 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 getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public User() {
        super();
    }

    public User(int id, String name, int age, String email) {
        super();
        this.id = id;
        this.name = name;
        this.age = age;
        this.email = email;
    }

    @Override
    public String toString() {
        return "User [id=" + id + ", name=" + name + ", age=" + age
                + ", email=" + email + "]";
    }
    

    

}


package com.util;
/**
 * 列标题列顺序和对应对象字段组成的自定义对象
 * excel和Object的中间对象
 * @author Administrator
 *
 */
public class ExcelHeader implements Comparable<ExcelHeader>{
    /**
     * excel的标题名
     */
    private String title;
    /**
     * 每一个标题的顺序
     */
    private int order;
    /**
     * 每一个列对应的字段名
     * @return
     */
    private String fieldName;
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public ExcelHeader(String title, int order,String filedName) {
        super();
        this.title = title;
        this.order = order;
        this.fieldName=filedName;
    }
    public ExcelHeader() {
        super();
        
    }
    
    @Override
    public String toString() {
        return "ExcelHeader [title=" + title + ", order=" + order
                + ", fieldName=" + fieldName + "]";
    }
    public int getOrder() {
        return order;
    }
    public void setOrder(int order) {
        this.order = order;
    }
    @Override
    public int compareTo(ExcelHeader o) {
        return order>o.order?1:(order==o.order?0:-1);
    }
    public void setFieldName(String fieldName) {
        this.fieldName = fieldName;
    }
    public String getFieldName() {
        return fieldName;
    }
    
}
package com.util;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.RichTextString;
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.usermodel.WorkbookFactory;

/**
 * Excel模板
 * @author Administrator
 *
 */
public class ExcelTemplate {
    private static ExcelTemplate et=new ExcelTemplate();
    public final static String DATA_LINE="datas";
    public final static String DEFAULT_STYLE="defaultStyle";
    public final static String OWNSTYLE="style";
    private Workbook wb;
    private Sheet sheet;
    /**
     * 数据的初始化列
     */
    private int initColIndex;
    /**
     * 数据的初始化行
     */
    private int initRowIndex;
    /**
     * 数据的当前列
     */
    private int curColIndex;
    /**
     * 数据的当前行
     */
    private int curRowIndex;
    /**
     * 数据的最后一行
     */
    private int lastRowIndex;
    /**
     * 当前行对象
     */
    private Row curRow;
    /**
     * 默认样式
     */
    private CellStyle defaultStyle;
    /**
     * 自定义的样式的集合
     */
    private Map<Integer,CellStyle> styles;
    /**
     * 数据列行高
     */
    private float dataLineHeight;
    /**
     * 单例获取et
     * @return
     */
    public static ExcelTemplate getInstance(){
        return et;
    }
    /**
     * 根据classPath读取模板
     * @param classPath
     * @return
     */
    public ExcelTemplate readTemplateByClasspath(String classPath){
        try {
            wb=WorkbookFactory.create(ExcelTemplate.class.getResourceAsStream(classPath));
        } catch (InvalidFormatException e) {
            e.printStackTrace();
            throw new RuntimeException("取读模板格式有误!请检查");
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException("取读的模板不存在!请检查");
        }
        initTemp();
        return et;
    }
    /**
     * 根据filePath读取模板
     * @param filePath
     * @return
     */
    public ExcelTemplate  readTemplateByFilepath(String filePath){
        try {
            wb=WorkbookFactory.create(new File(filePath));
        }catch (InvalidFormatException e) {
            e.printStackTrace();
            throw new RuntimeException("取读模板格式有误!请检查");
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException("取读的模板不存在!请检查");
        }
        initTemp();
        return et;
    }
    /**
     * 将Workbook写入文件
     * @param filePath
     */
    public void writeToFile(String filePath){
        FileOutputStream fos=null;
        try {
            fos=new FileOutputStream(filePath);
            wb.write(fos);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            throw new RuntimeException("写入的文件不存在!"+e.getMessage());
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException("写入数据失败!"+e.getMessage());
        }finally{
            try {
                if(fos!=null){
                    fos.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    /**
     * 将Workbook写入输出流
     * @param os
     */
    public void writeToStream(OutputStream os){
        try {
            wb.write(os);
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException("写入流失败!"+e.getMessage());
        }
    }
    /**
     * 初始化模板
     */
    public void initTemp(){
        sheet=wb.getSheetAt(0);
        initConfigData();
        curRow=sheet.getRow(initRowIndex);
    }
    /**
     * 获取初始化配置数据
     */
    private void initConfigData() {
        lastRowIndex=sheet.getLastRowNum();
        styles=new HashMap<Integer,CellStyle>();
        int styleinRow=0;
        for(Row row:sheet){
            for(Cell cell:row){
                if(cell.getCellType()!=Cell.CELL_TYPE_STRING) continue;
                String str=cell.getStringCellValue().trim();
                if(str.equals(DATA_LINE)){
                    curColIndex=initColIndex=cell.getColumnIndex();
                    curRowIndex=initRowIndex=cell.getRowIndex();
                    dataLineHeight=row.getHeightInPoints();
                }
                if(str.equals(DEFAULT_STYLE)){
                    defaultStyle=cell.getCellStyle();
                    styleinRow=cell.getRowIndex();
                }
                if(str.equals(OWNSTYLE)){
                    styles.put(cell.getColumnIndex(), cell.getCellStyle());
                    styleinRow=cell.getRowIndex();
                }
                
                /**
                 * 后面可以附加好多其他东西
                 */
                
            }
        }
        //sheet.removeRow(sheet.getRow(styleinRow));//这里将设置样式的一行删除,样式已经完成了
        /*直接删除不能实现下面的行自动往上顶,使用移动下面的行将前面的行覆盖实现*/
        sheet.shiftRows(styleinRow+1,lastRowIndex--, -1, true, true);
    }
    /**
     * 创建新行
     */
    public void createNewRow(){
        moveData();
        curRow=sheet.createRow(++curRowIndex);
        curRow.setHeightInPoints(dataLineHeight);
        curColIndex=initColIndex;
    }
    /**
     * 创建新列并为新列赋值
     * @param value
     */
    public void createCell(String value){
        Cell c=curRow.createCell(curColIndex);
        if(styles.containsKey(curColIndex))
            c.setCellStyle(styles.get(curColIndex));
        else
            c.setCellStyle(defaultStyle);
        c.setCellValue(value);
        curColIndex++;
    }
    public void createCell(int value){
        Cell c=curRow.createCell(curColIndex);
        if(styles.containsKey(curColIndex))
            c.setCellStyle(styles.get(curColIndex));
        else
            c.setCellStyle(defaultStyle);
        c.setCellValue(value);
        curColIndex++;
    }
    public void createCell(double value){
        Cell c=curRow.createCell(curColIndex);
        if(styles.containsKey(curColIndex))
            c.setCellStyle(styles.get(curColIndex));
        else
            c.setCellStyle(defaultStyle);
        c.setCellValue(value);
        curColIndex++;
    }
    public void createCell(boolean value){
        Cell c=curRow.createCell(curColIndex);
        if(styles.containsKey(curColIndex))
            c.setCellStyle(styles.get(curColIndex));
        else
            c.setCellStyle(defaultStyle);
        c.setCellValue(value);
        curColIndex++;
    }
    public void createCell(Date value){
        Cell c=curRow.createCell(curColIndex);
        if(styles.containsKey(curColIndex))
            c.setCellStyle(styles.get(curColIndex));
        else
            c.setCellStyle(defaultStyle);
        c.setCellValue(value);
        curColIndex++;
    }
    public void createCell(Calendar value){
        Cell c=curRow.createCell(curColIndex);
        if(styles.containsKey(curColIndex))
            c.setCellStyle(styles.get(curColIndex));
        else
            c.setCellStyle(defaultStyle);
        c.setCellValue(value);
        curColIndex++;
    }
    public void createCell(RichTextString value){
        Cell c=curRow.createCell(curColIndex);
        if(styles.containsKey(curColIndex))
            c.setCellStyle(styles.get(curColIndex));
        else
            c.setCellStyle(defaultStyle);
        c.setCellValue(value);
        curColIndex++;
    }
    
    /**
     * 将excel尾部描述列往后移动
     */
    private void moveData(){
        sheet.shiftRows(curRowIndex+1, lastRowIndex++, 1,true, true);    
    }
    /**
     * 设置序号 可选
     */
    public void insertSerial(){
        int serialRow=-1;
        int serialCol=-1;
        boolean findSerial=false;
        for(Row row:sheet){
            if(findSerial) break;
            for(Cell cell:row){
                if(cell.getCellType()!=Cell.CELL_TYPE_STRING) continue;
                String str=cell.getStringCellValue().trim();
                if(str.equals("serial")){
                    serialRow=cell.getRowIndex();
                    serialCol=cell.getColumnIndex();
                    findSerial=true;
                    break;
                }
            }
        }
        if(serialRow==-1 || serialCol==-1){
            return;
        }
        int count=curRowIndex-initRowIndex+1;
        for(int i=1;i<=count;i++){
            Cell c=sheet.getRow(serialRow++).createCell(serialCol);
            c.setCellValue(i);
        }
    }
    /**
     * 为一些变量赋值
     * @param datas
     */
    public void replaceVariable(Map<String,String> datas){
        for(Row row:sheet){
            for(Cell cell:row){
                if(cell.getCellType()!=Cell.CELL_TYPE_STRING) continue;
                String str=cell.getStringCellValue().trim();
                if(!str.startsWith("#")) continue;
                if(datas.containsKey(str.substring(1))){
                    cell.setCellValue(datas.get(str.substring(1)));
                }
            }
        }
    }
}
package com.util;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.poi.EncryptedDocumentException;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Cell;
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.usermodel.WorkbookFactory;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import com.ann.Column;


/**
 * 对象和excel之间的互相转换
 * 使用模板写入excel与不使用模板写入
 * 读取excel数据到对象集合
 * @author Administrator
 *
 */
@SuppressWarnings({"rawtypes","unchecked"})
public class ExcelUtil {
    private static ExcelUtil eu=new ExcelUtil();
    /**
     * 单例
     */
    private ExcelUtil(){}
    /**
     * excel字段内容对象集合
     */
    private List<ExcelHeader> headers;
    
    public static ExcelUtil getInstance(){
        return eu;
    }
    /**
     * 模板对象
     */
    private ExcelTemplate et;
    /**
     * excel工作薄对象
     */
    private Workbook wb;
    /**
     * 将对象插入到excel表格中,使用模板,目标是文件
     * @param datas
     * @param alertableValues
     * @param objectClassType
     * @param path
     * @param isFilePath
     * @param outPath
     */
    public void Obj2ExcelUseTemplate(List<Object> datas,Map<String,String> alertableValues,Class objectClassType,String path,boolean isFilePath,String outPath){
        et=isFilePath?ExcelTemplate.getInstance().readTemplateByFilepath(path):ExcelTemplate.getInstance().readTemplateByClasspath(path);
        try {
            handerObj2ExcelUseTemplate(datas,alertableValues,objectClassType);
            
            et.writeToFile(outPath);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        }
    }
    /**
     * 将对象插入到excel表格中,使用模板,目标是输出流
     * @param datas
     * @param alertableValues
     * @param objectClassType
     * @param path
     * @param isFilePath
     * @param os
     */
    public void Obj2ExcelUseTemplate(List<Object> datas,Map<String,String> alertableValues,Class objectClassType,String path,boolean isFilePath,OutputStream os){
        et=isFilePath?ExcelTemplate.getInstance().readTemplateByFilepath(path):ExcelTemplate.getInstance().readTemplateByClasspath(path);
        try {
            handerObj2ExcelUseTemplate(datas,alertableValues,objectClassType);
            et.writeToStream(os);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        }
    }
    /**
     * 将对象插入到excel表格中,使用模板,目标是文件
     * @param datas
     * @param alertableValues
     * @param objectClassType
     * @param path
     * @param isFilePath
     * @param outPath
     */
    
    public void Obj2ExcelUseTemplate(List<Object> datas,Properties prop,Class objectClassType,String path,boolean isFilePath,String outPath){
        et=isFilePath?ExcelTemplate.getInstance().readTemplateByFilepath(path):ExcelTemplate.getInstance().readTemplateByClasspath(path);
        try {
            Map maps=new HashMap<String,String>();
            if(!(prop==null || prop.size()==0)) maps.putAll(prop);
            handerObj2ExcelUseTemplate(datas,maps,objectClassType);
            et.writeToFile(outPath);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        }
    }
    /**
     * 将对象插入到excel表格中,使用模板,目标是输出流
     * @param datas
     * @param alertableValues
     * @param objectClassType
     * @param path
     * @param isFilePath
     * @param os
     */
    public void Obj2ExcelUseTemplate(List<Object> datas,Properties prop,Class objectClassType,String path,boolean isFilePath,OutputStream os){
        et=isFilePath?ExcelTemplate.getInstance().readTemplateByFilepath(path):ExcelTemplate.getInstance().readTemplateByClasspath(path);
        try {
            Map maps=new HashMap<String,String>();
            if(!(prop==null || prop.size()==0)) maps.putAll(prop);
            handerObj2ExcelUseTemplate(datas,maps,objectClassType);
            et.writeToStream(os);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        }
    }
    /**
     * 使用模板将对象插入Excel中的转换工作的方法
     * @param datas
     * @param alertableValues
     * @param objectClassType
     * @throws IllegalAccessException
     * @throws InvocationTargetException
     * @throws NoSuchMethodException
     * @throws InstantiationException
     */
    private void handerObj2ExcelUseTemplate(List<Object> datas,Map<String,String> alertableValues,Class objectClassType) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException, InstantiationException{
        headers=getHeaderList(objectClassType);
        Collections.sort(headers);
        for(ExcelHeader eh:headers){//设置标题
            et.createCell(eh.getTitle());
        }
        for(Object o:datas){
            et.createNewRow();
            for(ExcelHeader eh:headers){
                et.createCell(BeanUtils.getProperty(o, eh.getFieldName()));
            }
        }
        if(alertableValues==null || alertableValues.size()==0) return;
        et.replaceVariable(alertableValues);
    }
    /**
     * 获取excel字段内容对象集合
     * @param clz
     * @return
     */
    private List<ExcelHeader> getHeaderList(Class clz) {
        List<ExcelHeader> headers=new ArrayList<ExcelHeader>();
        Field[] fields=clz.getDeclaredFields();
        for(Field f:fields){
            if(f.isAnnotationPresent(Column.class)){
                Column c=f.getAnnotation(Column.class);
                headers.add(new ExcelHeader(c.title(), c.order(), f.getName()));
            }
        }
        return headers;
    }
    /**
     * 对象写入excel文件
     * @param isXSSF
     * @param datas
     * @param objectClassType
     * @param outPath
     */
    public void Obj2Excel(boolean isXSSF,List<Object> datas,Class objectClassType,String outPath){
        wb=isXSSF?(new XSSFWorkbook()):(new HSSFWorkbook());
        try {
            Obj2Excel(datas,objectClassType);
            writeToFile(outPath);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }    
    }
    /**
     * 对象写入excel文件 流
     * @param isXSSF
     * @param datas
     * @param objectClassType
     * @param os
     */
    public void Obj2Excel(boolean isXSSF,List<Object> datas,Class objectClassType,OutputStream os){
        wb=isXSSF?(new XSSFWorkbook()):(new HSSFWorkbook());
        try {
            Obj2Excel(datas,objectClassType);
            writeToStream(os);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }    
    }
    /**
     * 将Workbook写入文件
     * @param outPath
     */
    private void writeToFile(String outPath) {
        FileOutputStream fos=null;
        try {
            fos = new FileOutputStream(outPath);
            wb.write(fos);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            try {
                if(fos!=null) fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    /**
     * 将Workbook写入输出流
     * @param os
     */
    private void writeToStream(OutputStream os){
        try {
            wb.write(os);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    /**
     * 处理将对象转换成excel的具体实现,不使用模板
     * @param datas
     * @param objectClassType
     * @throws IllegalAccessException
     * @throws InvocationTargetException
     * @throws NoSuchMethodException
     */
    private void Obj2Excel(List<Object> datas,Class objectClassType) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException{
        Sheet sheet=wb.createSheet();
        Row r=sheet.createRow(0);
        //插入表头
        headers=getHeaderList(objectClassType);
        Collections.sort(headers);
        for(int i=0;i<headers.size();i++){
            Cell c=r.createCell(i);
            c.setCellValue(headers.get(i).getTitle());
        }
        //插入数据内容
        for(int i=0;i<datas.size();i++){
            r=sheet.createRow(i+1);
            for(int j=0;j<headers.size();j++){
                Cell c=r.createCell(j);
                c.setCellValue(BeanUtils.getProperty(datas.get(i),headers.get(j).getFieldName()));
            }
        }
    }
    /**
     * 从流中读取表格信息到对象集合
     * @param ins
     * @param objectClassType
     * @param readLine
     * @param tailLine
     * @return
     */
    public List<Object> readExcel2Objs(InputStream ins,Class objectClassType,int readLine,int tailLine){
        try {
            wb=WorkbookFactory.create(ins);
            return handerReadExcel2Objs(objectClassType,readLine,tailLine);
        } catch (EncryptedDocumentException e) {
            e.printStackTrace();
        } catch (InvalidFormatException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        return null;
    }
    /**
     * 从文件中读取表格信息到对象集合
     * @param filePath
     * @param objectClassType
     * @param readLine
     * @param tailLine
     * @return
     */
    public List<Object> readExcel2Objs(String filePath,Class objectClassType,int readLine,int tailLine){
        try {
            wb=WorkbookFactory.create(new File(filePath));
            return handerReadExcel2Objs(objectClassType,readLine,tailLine);
        } catch (EncryptedDocumentException e) {
            e.printStackTrace();
        } catch (InvalidFormatException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        return null;
    }
    /**
     * 转换表格信息到对象集合的实现方法
     * @param objectClassType
     * @param readLine
     * @param tailLine
     * @return
     * @throws InstantiationException
     * @throws IllegalAccessException
     * @throws InvocationTargetException
     */
    private List<Object> handerReadExcel2Objs(Class objectClassType,int readLine,int tailLine) throws InstantiationException, IllegalAccessException, InvocationTargetException{
        List<Object> objs=new ArrayList<Object>();
        Sheet sheet=wb.getSheetAt(0);
        Map<Integer,String> headerMap=getHeaderMap(sheet.getRow(readLine),objectClassType);//列数和字段的map集合
        for(int i=readLine+1;i<sheet.getLastRowNum()-tailLine+1;i++){
            Row r=sheet.getRow(i);
            Object o=objectClassType.newInstance();
            Set<Integer> cols=headerMap.keySet();
            for(int x:cols){
                Cell c=r.getCell(x);
                BeanUtils.copyProperty(o, headerMap.get(x), getCellValue(c));
            }
            objs.add(o);
        }
        return objs;
    }
    /**
     * 获取不同值的方法
     * @param cell
     * @return
     */
    private Object getCellValue(Cell cell){
        int type=cell.getCellType();
        String show=null;
        switch(type){
        case Cell.CELL_TYPE_BLANK:
            show=null;break;
        case Cell.CELL_TYPE_BOOLEAN:
            show= String.valueOf(cell.getBooleanCellValue());break;
        case Cell.CELL_TYPE_ERROR:
            show=String.valueOf(cell.getErrorCellValue());break;
        case Cell.CELL_TYPE_FORMULA:
            show=cell.getCellFormula();break;
        case Cell.CELL_TYPE_NUMERIC:
            show=String.valueOf(cell.getNumericCellValue());break;
        case Cell.CELL_TYPE_STRING:
            show=cell.getStringCellValue();break;
        default:
            show=null;
        }
        return show;
    }
    /**
     * 获取列和对应字段的映射集合
     */
    public Map<Integer,String> getHeaderMap(Row r,Class objectClassType){
        headers=getHeaderList(objectClassType);
        Collections.sort(headers);
        Map<Integer,String> maps=new HashMap<Integer,String>();
        for(Cell c:r){
            String title=c.getStringCellValue();
            for(ExcelHeader eh:headers){
                if(title.equals(eh.getTitle())){
                    maps.put(c.getColumnIndex(), eh.getFieldName());
                    break;
                }
            }
        }
        return maps;
    }
}

一个用来测试的properties:
title="User Message List"
date="2016-7-11"
author="guodaxia"
View Code
原文地址:https://www.cnblogs.com/aigeileshei/p/5662937.html