Java利用Apache POI将数据库数据导出为excel

将数据库中的数据导出为excel文件,供其他人查看

public class POITest {

    public static void main(String[] args) {
        POITest test = new POITest();
        
//        test.readExcelToDB();
        
        test.writeExcelFromDB();
        
    }
    
    static class Book{
        public String title;
        public String author;
        public String date;
    }
    
    SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");
    ComboPooledDataSource dataSource;
    public POITest() {
        //初始化数据库连接池
        try {
            dataSource = new ComboPooledDataSource();
            dataSource.setDriverClass("com.mysql.cj.jdbc.Driver");
            dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test?user=root&password=123456"
                    + "&characterEncoding=utf8&serverTimezone=UTC");
        } catch (PropertyVetoException e) {
            e.printStackTrace();
        }
    }
    
    //从数据库读取数据并保存为excel
    public void writeExcelFromDB(){
        List<Book> books = new ArrayList<POITest.Book>();
        try {
            Connection conn = dataSource.getConnection();
            Statement statement = conn.createStatement();
            ResultSet resultSet = statement.executeQuery("select * from book");
            while(resultSet.next()){
                Book book = new Book();
                //第一列是id
                book.title = resultSet.getString(2);
                book.author = resultSet.getString(3);
                book.date = format.format(resultSet.getDate(4));
                books.add(book);
            }
            
            writeExcel(books);
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        
    }
    
    //HSSF 写excel
    private void writeExcel(List<Book> books) throws IOException{
        HSSFWorkbook workbook = new HSSFWorkbook();
        //创建表
        HSSFSheet sheet = workbook.createSheet("书本");
        //创建首行
        HSSFRow topRow = sheet.createRow(0);
        //创建首行单元格样式
        HSSFCellStyle topCellStyle = workbook.createCellStyle();
        topCellStyle.setAlignment(HorizontalAlignment.CENTER);
        topCellStyle.setFillForegroundColor(HSSFColor.YELLOW.index);
        topCellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        topCellStyle.setBorderBottom(BorderStyle.THIN);
        topCellStyle.setBorderLeft(BorderStyle.THIN);
        topCellStyle.setBorderTop(BorderStyle.THIN);
        topCellStyle.setBorderRight(BorderStyle.THIN);
        HSSFFont topFont = workbook.createFont();
        topFont.setColor(HSSFColor.BLACK.index);
        topCellStyle.setFont(topFont);
        
        HSSFCell topCell = topRow.createCell(0);
        topCell.setCellValue("书名");
        topCell.setCellStyle(topCellStyle);
        topCell = topRow.createCell(1);
        topCell.setCellValue("作者");
        topCell.setCellStyle(topCellStyle);
        topCell = topRow.createCell(2);
        topCell.setCellValue("出版日期");
        topCell.setCellStyle(topCellStyle);
        
        //设置普通行单元格样式
        HSSFCellStyle cellStyle = workbook.createCellStyle();
        cellStyle.cloneStyleFrom(topCellStyle);
        cellStyle.setFillForegroundColor(HSSFColor.WHITE.index);
        cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        HSSFFont font = workbook.createFont();
        font.setColor(HSSFColor.BLACK.index);
        cellStyle.setFont(font);
        
        for (int i=0; i<books.size(); i++) {
            HSSFRow row = sheet.createRow(i+1);
            Book book = books.get(i);
            HSSFCell cell = row.createCell(0);
            cell.setCellValue(book.title);
            cell.setCellStyle(cellStyle);
            cell = row.createCell(1);
            cell.setCellValue(book.author);
            cell.setCellStyle(cellStyle);
            cell = row.createCell(2);
            cell.setCellValue(book.date);
            cell.setCellStyle(cellStyle);
        }
        
        FileOutputStream os = new FileOutputStream("d:/book.xls");
        workbook.write(os);
        os.flush();
        os.close();
    }
    

    //从本地读取excel数据插入数据库
    public void readExcelToDB(){
        try {
            List<Book> books = readExcel();
            Connection conn = dataSource.getConnection();
            String sql = "insert into book(title,author,submission_date) values(?,?,?)";
            PreparedStatement preparedStatement = conn.prepareStatement(sql);
            for (Book book : books) {
                preparedStatement.setString(1, book.title);
                preparedStatement.setString(2, book.author);
                preparedStatement.setDate(3, new Date(format.parse(book.date).getTime()));
                preparedStatement.addBatch();
            }
            preparedStatement.executeBatch();
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ParseException e) {
            e.printStackTrace();
        }
        
    }
    
    //HSSF 读excel
    private List<Book> readExcel() throws IOException{
        List<Book> books = new ArrayList<POITest.Book>();
        InputStream is = new FileInputStream(new File("d:/book_2.xls"));
        //得到工作薄
        HSSFWorkbook workbook = new HSSFWorkbook(is);
        //得到工作表
        Sheet sheet = workbook.getSheetAt(0);
        //得到行数
        int rowNum = sheet.getLastRowNum();
        //首行是标题行
        for(int i=1; i<=rowNum; i++){
            Book book = new Book();
            Row row = sheet.getRow(i);
            Cell cell = row.getCell(0);
            book.title = cell.getStringCellValue();
            cell = row.getCell(1);
            book.author = cell.getStringCellValue();
            cell = row.getCell(2);
            book.date = format.format(cell.getDateCellValue());
            books.add(book);
        }
        
        return books;
    }
    
}

book建表语句

CREATE TABLE `book` (
  `id` int(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
  `title` varchar(100) DEFAULT NULL,
  `author` varchar(40) DEFAULT NULL,
  `submission_date` date DEFAULT NULL
) 

设置列宽(index表示第几列,从0开始)

sheet.setColumnWidth(index, 30*256);

设置表格内容自动换行

CellStyle wrapStyle = workBook.createCellStyle();
wrapStyle.setWrapText(true);

wrapCell.setCellStyle(wrapStyle);
wrapCell.setCellValue("第一行
第二行");