Hỏi đáp về việc xuất ra file excel nhưng bị lỗi font

Discussion in 'Xây dựng ứng dụng chạy console, applet' started by Phạm Hải Ninh, 30/11/16.

  1. Phạm Hải Ninh

    Phạm Hải Ninh New Member

    chào các ban, hiện giờ mình làm 1 ứng dụng java có 1 chức năng là xuất ra file excel nhưng sau khi xuất file thì nó bị lỗi font , nếu xuất ra file .txt thì không lỗi nhưng nó lại không phân chia hàng với cột, trong code mình viết:
    private void btnXuatFileActionPerformed(java.awt.event.ActionEvent evt) {
    JFileChooser choose = new JFileChooser();
    int i = choose.showSaveDialog(this);
    if(i==JFileChooser.APPROVE_OPTION)
    {
    File file = choose.getSelectedFile();
    try {
    //FileWriter out = new FileWriter(file+".xls");
    //BufferedWriter bwrite = new BufferedWriter(out);
    FileOutputStream out = new FileOutputStream(file+".txt");
    Writer writer = new java.i:confused:utputStreamWriter(out, "utf8");
    BufferedWriter bwrite = new BufferedWriter(writer);
    DefaultTableModel model = (DefaultTableModel)tblBangDiem.getModel();
    //đặt tên cột
    for (int j = 0; j < model.getColumnCount(); j++) {
    bwrite.write(model.getColumnName(j)+"\t");
    }
    bwrite.write("\n");
    //đặt dữ liệu từng dòng
    for (int j = 0; j < model.getRowCount(); j++) {
    //cột
    for (int k = 0; k < model.getColumnCount(); k++) {
    bwrite.write(model.getValueAt(j, k)+"\t");
    }
    bwrite.write("\n");
    }
    bwrite.close();
    JOptionPane.showMessageDialog(this, "Ghi file thành công");
    } catch (IOException ex) {
    JOptionPane.showMessageDialog(this, "Ghi file thất bại");
    Logger.getLogger(BangDiem.class.getName()).log(Level.SEVERE, null, ex);
    }
    }
    }
    nếu có thể mong các bạn xem qua rồi chỉ chỗ sai để mình sửa chữa được không, mình cảm ơn.
  2. JackV

    JackV Administrator Staff Member

    Phạm Hải Ninh likes this.
  3. Ngô Ngọc Hòa

    Ngô Ngọc Hòa New Member

    Muốn xuất ra excel thì bạn phải dùng Apache Poi em nhé thì nó mới không bị lỗi unicode. Nói chung nó cũng khá phức tạp
    Phạm Hải Ninh likes this.
  4. Đây là code của mình. Mình đổ dữ liệu lên jtable rồi đọc từ jtable ra chứ k đọc từ CSDL ra thẳng file excel.
    ///////////////////////////
    JFileChooser j = new JFileChooser();
    j.setDialogTitle("Hãy chọn địa chỉ muốn xuất file !");
    int rs = j.showSaveDialog(null);
    if (rs == JFileChooser.APPROVE_OPTION) {
    String Path = j.getSelectedFile().getAbsolutePath();
    String name = j.getSelectedFile().getName();
    String exclePath = Path + ".xls";
    System.out.println(name);
    FileOutputStream fileOut = null;
    Workbook wb = (Workbook) new HSSFWorkbook();
    Sheet sheet = wb.createSheet("Cán Bộ");
    Row headerRow = sheet.createRow(0);
    Cell nameC1 = headerRow.createCell(0);
    nameC1.setCellValue("Mã Cán Bộ");
    Cell nameC2 = headerRow.createCell(1);
    nameC2.setCellValue("Tên Cán Bộ");
    Cell nameC3 = headerRow.createCell(2);
    nameC3.setCellValue("Học Vị");
    Cell nameC4 = headerRow.createCell(3);
    nameC4.setCellValue("Phòng Ban");
    Cell nameC5 = headerRow.createCell(4);
    nameC5.setCellValue("Vai Trò");
    //
    System.out.println(exclePath);
    try {
    fileOut = new FileOutputStream(exclePath);
    } catch (FileNotFoundException ex) {
    Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
    }
    int i = 0;
    int col = 1;
    for (i = 0; i < tbl_cb.getRowCount(); i++) {
    Row row = sheet.createRow(col);
    Cell cell1 = row.createCell(0);
    cell1.setCellValue((String) tbl_cb.getModel().getValueAt(i, 0));
    //
    Cell cell2 = row.createCell(1);
    cell2.setCellValue((String) tbl_cb.getModel().getValueAt(i, 1));
    //
    Cell cell3 = row.createCell(2);
    cell3.setCellValue((String) tbl_cb.getModel().getValueAt(i, 2));
    //
    Cell cell4 = row.createCell(3);
    cell4.setCellValue((String) (tbl_cb.getModel().getValueAt(i, 3)));
    //
    Cell cell5 = row.createCell(4);
    cell5.setCellValue((String) tbl_cb.getModel().getValueAt(i, 4));
    col = col + 1;
    }
    try {
    wb.write(fileOut);
    } catch (IOException ex) {
    Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
    }
    try {
    fileOut.close();
    } catch (IOException ex) {
    Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
    }
    }
  5. Đinh Thế Hiển

    Đinh Thế Hiển New Member

    Bạn add thêm charset cho đối tượng FileOutputStream
    VD : new FileOutputStream(fileDir), "UTF8")
  6. badboy3283

    badboy3283 Active Member

    Dùng POI, có thể viết hàm xuất ra file excel

    Hoặc dùng iReport để tạo file template để jasperreports parse thành file excel

    http://community.jaspersoft.com/project/ireport-designer
    https://poi.apache.org/spreadsheet/examples.html

    Code:
    <!-- for JasperReports -->
            <dependency>
                <groupId>net.sf.jasperreports</groupId>
                <artifactId>jasperreports</artifactId>
                <version>4.5.0</version>
                <exclusions>
                    <exclusion>
                        <artifactId>bcmail-jdk14</artifactId>
                        <groupId>bouncycastle</groupId>
                    </exclusion>
                    <exclusion>
                        <artifactId>bcprov-jdk14</artifactId>
                        <groupId>bouncycastle</groupId>
                    </exclusion>
                </exclusions>
            </dependency>
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi</artifactId>
                <version>3.9</version>
            </dependency>
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml</artifactId>
                <version>3.9</version>
            </dependency>
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-scratchpad</artifactId>
                <version>3.9</version>
            </dependency>
            <!-- End for JasperReport -->
    Example POI Excel:
    Code:
    /**
        * Export all sheet's data to filename
        *
        * @return
        */
        public void exportToFile(File file) throws IOException {
            // Write the output to a file
            OutputStream out = null;
            try {
                wb.write(out = new BufferedOutputStream(new FileOutputStream(file)));
            } finally {
                try {
                    out.flush();
                } catch (Exception ex) {
                    // safe
                }
                IOUtils.closeQuietly(out);
                dispose();
            }
        }
    
    Example Jasperreport

    Code:
    /**
         * Export data source to output: Output file or {@link File} or
         * {@link OutputStream}
         *
         * <br/>
         * Support types for report: <br/>
         *
         * pdf: Adobe Reader <br/>
         *
         * rtf: Word <br/>
         *
         * xls: Excel <br/>
         *
         * odt: Open office <br/>
         *
         * html: Html <br/>
         */
        public static void export(String type, ReportDataSource ds, Object output) throws Exception {
            InputStream is = null;
            try {
                // get template file
                is = JspContext.getBeanManager().getResource(ds.getReportSrc()).getInputStream();
                // Default value
                final Map fparams;
                Map exportPara = null;
                // the exporter parameters which user set
                if (ds.getParams() == null) {
                    fparams = new HashMap();
                } else {
                    fparams = ds.getParams();
                    exportPara = (Map) fparams.remove("exportParameter");
                }
                if (ds.getLocale() != null) {
                    fparams.put(JRParameter.REPORT_LOCALE, ds.getLocale());
                } else if (!fparams.containsKey(JRParameter.REPORT_LOCALE)) {
                    fparams.put(JRParameter.REPORT_LOCALE, Labels.getCurrentLocale());
                }
                // fill the report
                JasperPrint jasperPrint = JasperFillManager.fillReport(is, fparams,
                        ds.isEmpty() ? new JREmptyDataSource() : ds);
                // export one type of report
                JRExporter exporter = null;
                if ("rtf".equals(type)) {
                    exporter = new JRRtfExporter();
                    if (exportPara != null) {
                        exporter.setParameters(exportPara);
                    }
                } else if ("xls".equals(type)) {
                    exporter = new JRXlsExporter();
                    if (exportPara != null) {
                        exporter.setParameters(exportPara);
                    }
                    exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.TRUE);
                } else if ("odt".equals(type)) {
                    exporter = new JROdtExporter();
                    if (exportPara != null) {
                        exporter.setParameters(exportPara);
                    }
                } else if ("html".equals(type)) {
                    exporter = new JRHtmlExporter();
                    if (exportPara != null) {
                        exporter.setParameters(exportPara);
                    }
                    exporter.setParameter(JRHtmlExporterParameter.IS_USING_IMAGES_TO_ALIGN, Boolean.FALSE);
                } else {
                    exporter = new JRPdfExporter();
                }
                exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
                if (output instanceof OutputStream) {
                    exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, output);
                } else if (output instanceof File) {
                    Files.checkExisted(((File) output).getParentFile());
                    exporter.setParameter(JRExporterParameter.OUTPUT_FILE, output);
                } else if (output instanceof String) {
                    output = new File((String) output);
                    Files.checkExisted(((File) output).getParentFile());
                    exporter.setParameter(JRExporterParameter.OUTPUT_FILE, output);
                }
                exporter.exportReport();
            } finally {
                if (is != null) {
                    try {
                        is.close();
                    } catch (IOException e) {
                        // safe cache
                    }
                }
                if (output instanceof OutputStream) {
                    try {
                        ((OutputStream) output).close();
                    } catch (IOException e) {
                        // safe cache
                    }
                }
            }
        }

Chia sẻ trang này