1. 程式人生 > >Java生成excel報表檔案

Java生成excel報表檔案

此次簡單的操作將資料從資料庫匯出生成excel報表以及將excel資料匯入資料庫

首先建立資料庫的連線池:

複製程式碼

package jdbc;

import java.io.FileInputStream;
import java.sql.Connection;
import java.util.Properties;

import org.apache.commons.dbcp.BasicDataSource;

public class BaseDAO {
    private static BasicDataSource ds;
    static{                                                                                 
        try {                                                                                 
            //1.讀取配置檔案conf.properties,採用java.util.Properties來讀取                      
            Properties p=new Properties();                                                      
            //2.通過檔案流讀取並解析配置檔案內容,本地資料庫用的mysql,所以把配置檔案mysql的配置放開,其他資料庫配置註釋                                                
            p.load(new FileInputStream("src/jdbc.properties"));                                    
            String driverName=p.getProperty("jdbc.driverClassName");//獲取驅動名稱                        
            String url=p.getProperty("jdbc.url");//獲取資料庫的url                                
            String user=p.getProperty("jdbc.username");//使用者名稱                                          
            String password=p.getProperty("jdbc.password");//密碼                                    
            int maxActive=Integer.parseInt(p.getProperty("jdbc.maxActive"));//獲取最大連線數         
            int maxWait=Integer.parseInt(p.getProperty("jdbc.maxWait"));//獲取最大等待時間           
            //3.建立一個連線池                                                                  
            ds=new BasicDataSource();                                                           
            ds.setDriverClassName(driverName);//設定驅動名稱                                    
            ds.setUrl(url);//設定資料庫地址                                                     
            ds.setUsername(user);//設定使用者名稱                                                   
            ds.setPassword(password);//設定密碼                                                 
            ds.setMaxActive(maxActive);//設定最大連線數                                         
            ds.setMaxWait(maxWait);//設定最大等待時間                                                                                                                               
        } catch (Exception e) {                                                               
            e.printStackTrace();                                                                
        }                                                                                     
    }
    
    public static  Connection  getConnection() throws Exception {
        try {
            return ds.getConnection();
        } catch (Exception e) {
            System.out.println("連線資料庫異常");
            throw e;
        }
    }
    
    public static void close(Connection conn){                                              
        if(conn!=null){                                                                       
            try {                                                                               
                conn.close();                                                                     
            } catch (Exception e) {                                                             
                e.printStackTrace();                                                              
            }                                                                                   
        }                                                                                     
    } 

}

複製程式碼

生成與資料庫相對應的java實體類:

複製程式碼

package entity;

public class Test {
    private String a;
    private String b;
    private String c;    
    private String d;
    private String e;
    private String f;
    private String g;
    private String h;
    private String i;
    private String j;
    public String getA() {
        return a;
    }
    public void setA(String a) {
        this.a = a;
    }
    public String getB() {
        return b;
    }
    public void setB(String b) {
        this.b = b;
    }
    public String getC() {
        return c;
    }
    public void setC(String c) {
        this.c = c;
    }
    public String getD() {
        return d;
    }
    public void setD(String d) {
        this.d = d;
    }
    public String getE() {
        return e;
    }
    public void setE(String e) {
        this.e = e;
    }
    public String getF() {
        return f;
    }
    public void setF(String f) {
        this.f = f;
    }
    public String getG() {
        return g;
    }
    public void setG(String g) {
        this.g = g;
    }
    public String getH() {
        return h;
    }
    public void setH(String h) {
        this.h = h;
    }
    public String getI() {
        return i;
    }
    public void setI(String i) {
        this.i = i;
    }
    public String getJ() {
        return j;
    }
    public void setJ(String j) {
        this.j = j;
    }
    

}

複製程式碼

將excel表格資料插入資料庫,先讀取excel表格資料

複製程式碼

package readExcel;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.apache.poi.hssf.usermodel.HSSFCell;
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.apache.poi.xssf.usermodel.XSSFWorkbook;


public class ReadExcel {

    /**
     * @param args
     * @throws IOException 
     */
    
    public List<List<String>> readExcel(File file) throws IOException{
        List<List<String>> list=new ArrayList<List<String>>();
        if(!file.exists()){
            System.out.println("檔案不存在");
        }else{
            InputStream fis=new FileInputStream(file);    
            list=parseExcel(file,fis);
        }
        return list;        
    }
    
    public List<List<String>> parseExcel(File file,InputStream fis) throws IOException{
        Workbook workbook=null;
        List<List<String>> list=new ArrayList<List<String>>();
        if(file.toString().endsWith("xls")){
            workbook=new HSSFWorkbook(fis);
        }else if(file.toString().endsWith("xlsx")){
            workbook=new XSSFWorkbook(fis);
        }else{
            System.out.println("檔案不是excel文件型別 ,此處無法讀取");
        }
        for(int i=0;i<workbook.getNumberOfSheets();i++){
            Sheet sheet=workbook.getSheetAt(i); 
            if(sheet!=null){                
                int lastRow=sheet.getLastRowNum();
                //獲取表格中的每一行
                for(int j=0;j<=lastRow;j++){
                    Row row=sheet.getRow(j);
                    short firstCellNum=row.getFirstCellNum();
                    short lastCellNum=row.getLastCellNum();    
                    List<String> rowsList=new ArrayList<String>();
                    if(firstCellNum!=lastCellNum){                        
                        //獲取每一行中的每一列
                        for(int k=firstCellNum;k<lastCellNum;k++){
                            Cell cell=row.getCell(k);
                            if(cell==null){
                                rowsList.add("");
                            }else{
                                rowsList.add(chanegType(cell));
                            }
                        }
                    }else{
                        System.out.println("該表格只有一列");
                    }
                    list.add(rowsList);
                }
                
            }
        }
        return list;    
    }
    
    public String chanegType(Cell cell){
        String result = new String();  
        switch (cell.getCellType()) {  //獲取單元格的型別
        case HSSFCell.CELL_TYPE_NUMERIC:// 數字型別  
            if(cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC){  //如果是數值型別
                short format = cell.getCellStyle().getDataFormat(); //獲取這個單元的型別對應的數值
                SimpleDateFormat sdf = null;  
                if(format == 14 || format == 31 || format == 57 || format == 58){ //如果數值為14,31,57,58其中的一種 
                    //對應的日期格式為 2016-03-01這種形式,
                    sdf = new SimpleDateFormat("yyyy-MM-dd");  
                    double value = cell.getNumericCellValue();  
                    Date date = org.apache.poi.ss.usermodel.DateUtil.getJavaDate(value);  
                    result = sdf.format(date);//得到yyyy-MM-dd這種格式日期
                }else if (format == 20 || format == 32) {  
                    //時間  
                    sdf = new SimpleDateFormat("HH:mm");  
                    double value = cell.getNumericCellValue();  
                    Date date = org.apache.poi.ss.usermodel.DateUtil.getJavaDate(value);  
                    result = sdf.format(date);//得到HH:mm
                }  else {
                    double value = cell.getNumericCellValue();  
                    CellStyle style = cell.getCellStyle();  
                    DecimalFormat dataformat = new DecimalFormat();  
                    String temp = style.getDataFormatString();  
                    // 單元格設定成常規  
                    if (temp.equals("General")) {  
                        dataformat.applyPattern("#");  
                    }  
                    result = dataformat.format(value); //得到單元格數值
                }
            }  
            break;  
        case HSSFCell.CELL_TYPE_STRING:// String型別  
            result = cell.getRichStringCellValue().toString();  
            break;  
        case HSSFCell.CELL_TYPE_BLANK:  
            result = "";  
        default:  
            result = "";  
            break;  
        }  
        return result;        
    }    
}

複製程式碼

將讀取到的excel表格資料插入到資料庫中去

複製程式碼

package importdata;

import java.io.File;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.util.ArrayList;
import java.util.List;

import entity.Test;
import readExcel.ReadExcel;
import jdbc.BaseDAO;
public class inportData {
    
    
    
    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        List<List<String>> list = new ArrayList<List<String>>();
        ReadExcel readExcel=new ReadExcel();
        File file=new File("d:/test.xlsx");
        list=readExcel.readExcel(file);
        
        Test test=new Test();
        Connection conn=BaseDAO.getConnection();
        PreparedStatement ps=null;
        int i=1;
        for(List<String> rowlist:list){
            if(rowlist!=null){
                test.setA(rowlist.get(0).toString());
                test.setB(rowlist.get(1).toString());
                test.setC(rowlist.get(2).toString());
                test.setD(rowlist.get(3).toString());            
                test.setE(rowlist.get(4).toString());
                test.setF(rowlist.get(5).toString());
                test.setG(rowlist.get(6).toString());
                test.setH(rowlist.get(7).toString());
                test.setI(rowlist.get(8).toString());
                test.setJ(rowlist.get(9).toString());
                String sql="insert into TEST(A,B,C,D,E,F,G,H,I,J) values(?,?,?,?,?,?,?,?,?,?)";
                ps=conn.prepareStatement(sql);
                ps.setString(1,test.getA());
                ps.setString(2,test.getB());
                ps.setString(3,test.getC());
                ps.setString(4,test.getD());
                ps.setString(5,test.getE());
                ps.setString(6,test.getF());
                ps.setString(7,test.getG());
                ps.setString(8,test.getH());
                ps.setString(9,test.getI());
                ps.setString(10,test.getJ());
                int n=ps.executeUpdate();
                if(n!=1){
                    System.out.println("資料插入資料庫失敗");
                }
                System.out.println("第"+i+"條資料插入成功");
                System.out.println();
                i++;
            }
        }
        
        
    }

}

複製程式碼

將資料庫中的資料查詢出來並以excel表格的形式生成報表

複製程式碼

package export;

import java.io.FileOutputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
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.xssf.usermodel.XSSFWorkbook;

import entity.Test;

import jdbc.BaseDAO;

public class Export {
    
    
    public static void createExcel(List<Test> list){
        FileOutputStream fos=null;
        Workbook workbook=new XSSFWorkbook();    
        Sheet sheet=workbook.createSheet("測試檔案");
        String[] title={"第一列","第二列","第三列","第四列","第五列","第六列","第七列","第八列","第九列","第十列"};
        Row row=sheet.createRow((short)0);
        int i=0;
        for(String s:title){
            Cell cell=row.createCell(i);
            cell.setCellValue(s);
            i++;
        }
        int j=1;
        for(Test t:list){
            //建立第二行
            Row rowData=sheet.createRow((short)j);
            //第一列資料
            Cell cell0=rowData.createCell((short)0);
            cell0.setCellValue(t.getA());
            //設定單元格的寬度
            sheet.setColumnWidth((short)0, (short)10000);
            //第二列資料
            Cell cell1=rowData.createCell((short)1);
            cell1.setCellValue(t.getB());
            //設定單元格的寬度
            sheet.setColumnWidth((short)0, (short)10000);
            //第三列資料
            Cell cell2=rowData.createCell((short)2);
            cell2.setCellValue(t.getC());
            //設定單元格的寬度
            sheet.setColumnWidth((short)0, (short)10000);
            //第四列資料
            Cell cell3=rowData.createCell((short)3);
            cell3.setCellValue(t.getD());
            //設定單元格的寬度
            sheet.setColumnWidth((short)0, (short)10000);
            //第五列資料
            Cell cell4=rowData.createCell((short)4);
            cell4.setCellValue(t.getE());
            //設定單元格的寬度
            sheet.setColumnWidth((short)0, (short)10000);
            //第六列資料
            Cell cell5=rowData.createCell((short)5);
            cell5.setCellValue(t.getF());
            //設定單元格的寬度
            sheet.setColumnWidth((short)0, (short)10000);
            //第七列資料
            Cell cell6=rowData.createCell((short)6);
            cell6.setCellValue(t.getG());
            //設定單元格的寬度
            sheet.setColumnWidth((short)0, (short)10000);
            //第八列資料
            Cell cell7=rowData.createCell((short)7);
            cell7.setCellValue(t.getH());
            //設定單元格的寬度
            sheet.setColumnWidth((short)0, (short)10000);
            //第九列資料
            Cell cell8=rowData.createCell((short)8);
            cell8.setCellValue(t.getI());
            //設定單元格的寬度
            sheet.setColumnWidth((short)0, (short)10000);
            //第十列資料
            Cell cell9=rowData.createCell((short)9);
            cell9.setCellValue(t.getJ());
            //設定單元格的寬度
            sheet.setColumnWidth((short)0, (short)10000);
            j++;
        }
        try {
            //匯出資料庫檔案儲存路徑
            fos=new  FileOutputStream("D:/export.xlsx");
            /*if(fos.toString().endsWith("xlsx")){
                workbook=new XSSFWorkbook();
            }else if(fos.toString().endsWith("xls")){
                workbook=new HSSFWorkbook();
            }*/
            //將工作簿寫入檔案
            workbook.write(fos);    
            System.out.println("匯出檔案成功");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            System.out.println("匯出檔案失敗");
        }
    }
    public static void main(String[] args) throws Exception {
        //連線資料庫
        Connection conn=BaseDAO.getConnection();
        PreparedStatement ps=null;        
        String sql="select * from TEST";
        //執行sql語句
        ps=conn.prepareStatement(sql);
        //查詢資料庫之後得到的結果
        ResultSet rs=ps.executeQuery();
        List<Test> list=new ArrayList<Test>();
        //遍歷查詢結果
        while(rs.next()){
            Test test=new Test();
            test.setA(rs.getString("A"));
            test.setB(rs.getString("B"));
            test.setC(rs.getString("C"));
            test.setD(rs.getString("D"));
            test.setE(rs.getString("E"));
            test.setF(rs.getString("F"));
            test.setG(rs.getString("G"));
            test.setH(rs.getString("H"));
            test.setI(rs.getString("I"));
            test.setJ(rs.getString("J"));
            list.add(test);            
        }
        createExcel(list);
    }
    
}