در این پست نحوه تبدیل یک کوئری را به اکسل آموزش خواهم داد و از این پست برای ایجاد وب سرویس استفاده خواهم کرد. بنابراین به موارد تکراری اشاره نکرده و صرفا روی تبدیل کوئری به اکسل تمرکز میکنیم:
برای اینکار نیاز به یک کلاس داریم به نام ResultSetToExcel که محتوای آن در زیر آمده است. وظیفه این کلاس تبدیل ResultSet به خروجی اکسل است:
package project1; import org.apache.poi.hssf.usermodel.*; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStream; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.Timestamp; import org.apache.poi.hssf.util.HSSFCellUtil; public class ResultSetToExcel { public static final String DATA_FORMAT = "dataFormat"; public static final String FILL_BACKGROUND_COLOR = "fillBackgroundColor"; public static final String FILL_FOREGROUND_COLOR = "fillForegroundColor"; public static final String FILL_PATTERN = "fillPattern"; private HSSFWorkbook workbook; private HSSFSheet sheet; private HSSFFont boldFont; private HSSFDataFormat format; private ResultSet resultSet; private FormatType[] formatTypes; public ResultSetToExcel(ResultSet resultSet, FormatType[] formatTypes, String sheetName) { workbook = new HSSFWorkbook(); this.resultSet = resultSet; sheet = workbook.createSheet(sheetName); boldFont = workbook.createFont(); boldFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); format = workbook.createDataFormat(); this.formatTypes = formatTypes; } public ResultSetToExcel(ResultSet resultSet, String sheetName) { this(resultSet, null, sheetName); } private FormatType getFormatType(Class _class) { if (_class == Integer.class || _class == Long.class) { return FormatType.INTEGER; } else if (_class == Float.class || _class == Double.class) { return FormatType.FLOAT; } else if (_class == Timestamp.class || _class == java.sql.Date.class) { return FormatType.DATE; } else { return FormatType.TEXT; } } public void generate(OutputStream outputStream) throws Exception { try { ResultSetMetaData resultSetMetaData = resultSet.getMetaData(); if (formatTypes != null && formatTypes.length != resultSetMetaData.getColumnCount()) { throw new IllegalStateException("Number of types is not identical to number of resultset columns. " + "Number of types: " + formatTypes.length + ". Number of columns: " + resultSetMetaData.getColumnCount()); } int currentRow = 0; HSSFRow row = sheet.createRow(currentRow); int numCols = resultSetMetaData.getColumnCount(); boolean isAutoDecideFormatTypes; if (isAutoDecideFormatTypes = (formatTypes == null)) { formatTypes = new FormatType[numCols]; } for (int i = 0; i < numCols; i++) { String title = resultSetMetaData.getColumnName(i + 1); writeCell(row, i, title, FormatType.TEXT, boldFont); if (isAutoDecideFormatTypes) { Class _class = Class.forName(resultSetMetaData.getColumnClassName(i + 1)); formatTypes[i] = getFormatType(_class); } } currentRow++; // Write report rows while (resultSet.next()) { row = sheet.createRow(currentRow++); for (int i = 0; i < numCols; i++) { Object value = resultSet.getObject(i + 1); writeCell(row, i, value, formatTypes[i]); } } // Autosize columns for (int i = 0; i < numCols; i++) { sheet.autoSizeColumn((short)i); } workbook.write(outputStream); } finally { outputStream.close(); } } public void generate(File file) throws Exception { generate(new FileOutputStream(file)); } private void writeCell(HSSFRow row, int col, Object value, FormatType formatType) { writeCell(row, col, value, formatType, null, null); } private void writeCell(HSSFRow row, int col, Object value, FormatType formatType, HSSFFont font) { writeCell(row, col, value, formatType, null, font); } private void writeCell(HSSFRow row, int col, Object value, FormatType formatType, Short bgColor, HSSFFont font) { HSSFCell cell = HSSFCellUtil.createCell(row, col, null); if (value == null) { return; } if (font != null) { HSSFCellStyle style = workbook.createCellStyle(); style.setFont(font); cell.setCellStyle(style); } switch (formatType) { case TEXT: cell.setCellValue(value.toString()); break; case INTEGER: cell.setCellValue(((Number)value).intValue()); HSSFCellUtil.setCellStyleProperty(cell, workbook, DATA_FORMAT, HSSFDataFormat.getBuiltinFormat(("#,##0"))); break; case FLOAT: cell.setCellValue(((Number)value).doubleValue()); HSSFCellUtil.setCellStyleProperty(cell, workbook, DATA_FORMAT, HSSFDataFormat.getBuiltinFormat(("#,##0.00"))); break; case DATE: cell.setCellValue((Timestamp)value); HSSFCellUtil.setCellStyleProperty(cell, workbook, DATA_FORMAT, HSSFDataFormat.getBuiltinFormat(("m/d/yy"))); break; case MONEY: cell.setCellValue(((Number)value).intValue()); HSSFCellUtil.setCellStyleProperty(cell, workbook, DATA_FORMAT, format.getFormat("($#,##0.00);($#,##0.00)")); break; case PERCENTAGE: cell.setCellValue(((Number)value).doubleValue()); HSSFCellUtil.setCellStyleProperty(cell, workbook, DATA_FORMAT, HSSFDataFormat.getBuiltinFormat("0.00%")); } if (bgColor != null) { HSSFCellUtil.setCellStyleProperty(cell, workbook, FILL_FOREGROUND_COLOR, bgColor); HSSFCellUtil.setCellStyleProperty(cell, workbook, FILL_PATTERN, HSSFCellStyle.SOLID_FOREGROUND); } } public enum FormatType { TEXT, INTEGER, FLOAT, DATE, MONEY, PERCENTAGE; } }
به طریق زیر از این کلاس استفاده خواهیم کرد. در این تکه کد نیز یک فایل خالی در مسیر C به نام excel-file ایجاد کرده و سپس با استفاده از متد generate اکسل را پر میکنیم:
package project1; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.Context; import javax.ws.rs.core.UriInfo; import java.io.File; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import javax.naming.NamingException; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.ResponseBuilder; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.Locale; @Path("/helloworld") public class HelloWorld { @Context private UriInfo context; private static final String FILE_PATH = "c:\\excel-file.xls"; public HelloWorld() { } @GET @Path("getFile") @Produces("application/vnd.ms-excel") public Response getFile() { String sqlString = "SELECT 'milad' as name FROM dual"; //<create an empty excel file HSSFWorkbook workbook = new HSSFWorkbook(); HSSFSheet firstSheet = workbook.createSheet("FIRST SHEET"); HSSFRow rowA = firstSheet.createRow(0); HSSFCell cellA = rowA.createCell(0); cellA.setCellValue(new HSSFRichTextString("")); FileOutputStream fos = null; try { fos = new FileOutputStream(new File(FILE_PATH)); workbook.write(fos); } catch (IOException e) { e.printStackTrace(); } finally { if (fos != null) { try { fos.flush(); fos.close(); } catch (IOException e) { e.printStackTrace(); } } }//create an empty excel file> File file = new File(FILE_PATH); PreparedStatement ps = null; try { Connection con = /*create a db connection*/ ps = con.prepareStatement(sqlString); ResultSet resultSet = ps.executeQuery(); ResultSetToExcel resultSetToExcel = new ResultSetToExcel(resultSet, new ResultSetToExcel.FormatType[] { ResultSetToExcel.FormatType.TEXT}, "sheet name"); resultSetToExcel.generate(file); } catch (SQLException e) { } catch (NamingException e) { } catch (Exception e) { } ResponseBuilder response = Response.ok((Object)file); response.header("Content-Disposition", "attachment; filename=new-excel-file.xls"); return response.build(); } }
برای استفاده از این کدها شما به کتابخانه هایی نیاز دارید که یکجا در اختیارتان قرار میگیرد: دریافت حجم: 7.45 مگابایت
با تشکر
میلاد
موفق باشید