天道酬勤,学无止境

Save Excel document Apache POI

I need to create informs from an excel document, I'm using Java and Apache POI. Here is my code:

    //Get path with JFileChooser
    public static String LeeRuta(){
        JFileChooser chooser = new JFileChooser();
        chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
        chooser.showDialog(chooser, "Seleccionar");
        File f =chooser.getSelectedFile();
        File camino = f.getAbsoluteFile();
        String ruta = camino.getAbsolutePath();
        return ruta;
    }

  //main
  public static void main(String args[]) {
    String ruta=LeeRuta();

    /* Don't know if neccesary, but it didn't works with or without it
    InputStream inp;
    try {
        inp = new FileInputStream(ruta);
    } catch (FileNotFoundException ex) {
        Logger.getLogger(PruebaExcel.class.getName()).log(Level.SEVERE, null, ex);
    }
    */

    Workbook exceldoc = null;

    // Opening file
      try {
         exceldoc = WorkbookFactory.create(new File(ruta));
        //wb = WorkbookFactory.create(new File(ruta));
    } catch (InvalidFormatException | IOException e) {
        e.printStackTrace();
    }


    //Selecting the sheet
    String nombredoc = exceldoc.getSheetName(0);
    Sheet hoja = exceldoc.getSheet(nombredoc);


        //Selecting the cell
        Cell celda = hoja.getRow(1).getCell(1);
//        System.out.println(celda);
        System.out.println(hoja.getRow(2).getCell(3));

        //Variables
        int anyo = 2014;
        String ota = "OTa 158";

        //Setting Cells value
        hoja.getRow(2).getCell(4).setCellValue(anyo);
        hoja.getRow(2).getCell(5).setCellValue(ota);

       //If I print here cell values, I see that values has been set.

        //Saving
        try {
            //hoja.getRow(3).getCell(4).setCellValue(fecha);
            FileOutputStream out = new FileOutputStream("C:\\Documents and Settings\\INGENIERIA2\\Mis documentos\\Informe.xls");
        } catch (FileNotFoundException ex) {
            Logger.getLogger(PruebaExcel.class.getName()).log(Level.SEVERE, null, ex);
        }
        try {
            exceldoc.write(out);
        } catch (IOException ex) {
            Logger.getLogger(PruebaExcel.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

The problem is that Informe.xls file is empty (file size = 0 KB) and Excel says its corrupted or damaged. I suppose I'm not doing well the output stream and the write, but don't know how to fix it.

评论

Uncompilable source code: you define variable out inside try-catch scope and then you use it inside another try-catch.

Try this code:

try {
    FileOutputStream out = new FileOutputStream("C:\\Documents and Settings\\INGENIERIA2\\Mis documentos\\Informe.xls");
    exceldoc.write(out);
    out.close();
} catch (FileNotFoundException ex) {
    Logger.getLogger(PruebaExcel.class.getName()).log(Level.SEVERE, null, ex);
}

How about this,

try (FileOutputStream out = new FileOutputStream("C:\\file\\path\\here\\Informe.xls")) {
    exceldoc.write(out);
} catch (FileNotFoundException ex) {
    Logger.getLogger(PruebaExcel.class.getName()).log(Level.SEVERE, null, ex);
}

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Java POI 异常(Java POI exception)
    问题 这些是我要做的步骤: 保存excel文件。 运行读取excel文件的程序。 当我执行这些步骤时,我立即收到此错误: java.lang.reflect.InvocationTargetException 在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 在java.lang.reflect.Constructor.newInstance(Constructor.java:513) 在 org.apache.poi.hssf.record.RecordFactory.createRecord(RecordFactory.java:224) 在 org.apache.poi.hssf.record.RecordFactory。 createRecords(RecordFactory.java:160
  • Java Apache POI Excel另存为PDF(Java Apache POI Excel save as PDF)
    问题 如何将excel文件转换/保存为pdf ? 我正在使用java play framework生成一些excel文件,现在需求更改为pdf 。 我不想重新编码所有内容。 有没有办法转换为pdf ? 我正在生成的excel文件来自模板。 我读取了excel模板文件,编写了更改,然后另存为新的excel文件。 这样,模板是不变的。 它包含边框,图像和其他格式。 回答1 您需要以下Java库和关联的JAR文件,程序才能正常工作。 POI v3.8 iText v5.3.4 试试这个例子将XLS转换为PDF 下面提供了接受Excel电子表格数据作为输入并将其转换为PDF表格数据的完整Java代码: import java.io.FileInputStream; import java.io.*; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.ss.usermodel.*; import java.util.Iterator; import com.itextpdf.text.*; import com.itextpdf.text.pdf.*; public class excel2pdf {
  • 如何使用POI API访问Java中受密码保护的Excel工作簿(How can I access password protected Excel workbook in Java using POI api)
    问题 我想读取和写入受密码保护的Excel文件。 如何使用Apache POI API做到这一点。 回答1 POI应该能够打开受保护的xls文件(使用org.apache.poi.hssf.record.crypt )和受保护的xlsx文件(使用org.apache.poi.poifs.crypt )。 你尝试过这些吗? 如果您使用的是HSSF(用于xls文件),则需要在打开文件之前设置密码。 为此,您可以致电: org.apache.poi.hssf.record.crypto.Biff8EncryptionKey.setCurrentUserPassword(password); 之后,HSSF应该可以打开您的文件。 对于XSSF,您需要以下内容: POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("protect.xlsx")); EncryptionInfo info = new EncryptionInfo(fs); Decryptor d = new Decryptor(info); d.verifyPassword(Decryptor.DEFAULT_PASSWORD); XSSFWorkbook wb = new XSSFWorkbook(d.getDataStream(fs)); 。 或者
  • How to fill in Excel file using java
    I have the following code to fill in the Excel file, with information that I get from the Internet using Jsoup. package knvbj; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.List; 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 org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.nodes.TextNode; import org.jsoup.select
  • org.apache.poi.POIXMLException 目前不支持严格的 OOXML,请参阅错误 #57699(org.apache.poi.POIXMLException Strict OOXML isn't currently supported, please see bug #57699)
    问题 我想用java解析一个Excel文件,所以我使用的是apache poi库,这里你是maven依赖: <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.14</version> </dependency> 这将包括一系列依赖项: poi-ooxml-3.14.jar poi-3.14.jar commons-codec-1.10.jar poi-ooxml-schemas-3.14.jar xmlbeans-2.6.0.jar stax-api-1.0.1.jar curvesapi-1.03.jar 当我尝试使用以下代码读取 Office 365 Excel 文件 (.xslx) 时: 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; public class
  • 如何摆脱“保存更改”? 提示使用 Apache POI XSSF 创建的 xlsx 文件(How to get rid of “Save changes?” prompt on xlsx-files created with Apache POI XSSF)
    问题 打开并立即关闭使用 Apache POI XSSF 创建的 xlsx 文件后,系统提示我保存未保存的更改。 据我所知,这是因为我在 xlsx 文件中使用了公式。 根据javadoc,这应该通过设置XSSFWorkbook.setForceFormulaRecalculation(true)来绕过但是,这并不能解决问题。 我还尝试在保存文件之前手动重新计算公式,但没有成功。 SSCCE: import java.io.FileOutputStream; import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFFormulaEvaluator; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class XSSFExample { public static void main(String[] args) { // Create workbook and sheet Workbook wb = new XSSFWorkbook(
  • Python 或 LibreOffice 保存用密码加密的 xlsx 文件(Python or LibreOffice Save xlsx file encrypted with password)
    问题 我正在尝试保存一个用密码加密的 Excel 文件。 我已经尝试按照 https://help.libreoffice.org/Common/Protecting_Content_in 上的指南进行操作 - 并且运行良好。 但是,这是在 GUI 中,但我正在寻找在无头模式下使用命令行界面的解决方案。 我看过那man libreoffice ,但我在那里找不到任何东西。 同样,我查看了 Python 3 库openpyxl的文档,但我也没有发现任何有用的东西。 是否可以使用不需要任何用户交互或 X 会话的命令行(或 Python 库)在 Ubuntu 14.04/16.04 上保存使用密码加密的 Excel 2007+ 文件? 回答1 有使用 Jython 和 Apache POI 的解决方案。 如果你想从 CPython/PyPy 使用它,你可以使用 subprocess 模块来调用外部 Jython 脚本。 我假设你已经安装了 Java JRE/JDK 使用 Excel/Calc 创建未加密的xlsx 文件或使用 xlsxwriter 或 openpyxl 并将其保存为test1.xlsx 下载独立的 Jython 下载 Apache POI 在独立 Jython jar 所在的同一目录中提取 Apache POI 将以下 Jython 脚本另存为encrypt.py :
  • 如何使用Java填写Excel文件(How to fill in Excel file using java)
    问题 我有以下代码来填充Excel文件,其中包含我使用Jsoup从Internet获得的信息。 package knvbj; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.List; 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 org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.nodes.TextNode; import org.jsoup.select.Elements; public class KNVBJ { private static int Clnummer=1; public
  • autojs之excel
    使用场景 autojs对接poi操作excel POI简介 Apache POI - the Java API for Microsoft Documents 效果展 autojs版本 黑科技 使用未安装的apk中的类 大佬大柒在群内分享过一个脚本, 就是加载未安装的apk中的资源 本篇教程主要是使用未安装的apk中的类 代码讲解 1. 实例化dexClassLoader let apkPath = "/storage/emulated/0/MT2/apks/AndroidPoi_1.0.apk"; let dexClassLoader = new DexClassLoader(apkPath); 2. 创建空文件, 确保文件存在 let filePath = "/sdcard/脚本/excel/yashu.xls"; //文件路径 files.createWithDirs(filePath); 3. 创建Excel文件(Workbook) let HSSFWorkbook = dexClassLoader.loadClass("org.apache.poi.hssf.usermodel.HSSFWorkbook"); // 无参实例化 let workbook = HSSFWorkbook.newInstance(); 4. 填写表数据 创建文档摘要信息(workbook)
  • POI和EasyExcel-你还在为导入导出数据苦恼吗?
    文章目录 写在前面POI导入依赖写入读取计算公式 EasyExcel导入依赖写入读取 实战 写在前面 在开发中经常会涉及到excel的处理,比如导出用户信息为excel表格、打印报表、月销售情况、成绩单等等(导出数据),还有将excel的信息录入到网站数据库等(导入数据),我们不可能手动操作,所以介绍Apache的POI和阿里巴巴的EasyExcel。 POI Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。 官网https://poi.apache.org/ xls和xlsx 首先注意下xls(2003版)和xlsx(2007版)的区别,都是excel的格式,后缀名不同。关键xls只有65536行,而xlsx没有行数限制,后续都以xlsx为例,如果要用xls格式,操作都是类似的,导入对应依赖,修改后缀名和注意数据溢出(65536)。 对象说明 java是面向对象编程,那么excel的操作也是对应到具体对象的,即工作簿,工作表,行和列。 其中需要注意的是工作簿(Workbook)接口下实现类的区别,HSSF是03版的,XSSF是07版,SXSSF是07优化(提升速度) 其余如word等导入依赖照葫芦画瓢 导入依赖 不会Maven参考这里 <!--xls(03)--> <!--
  • Java实现Excel表格的导入和导出(一)
    多说两句:表格的导入导出,是比较常见的系统操作,一般涉及数据批量导入导出时会用到,以前遇到过的业务场景有批量添加会员信息,数据迁移等。实现工具,Apache的poi最为常见。实现简单,博客简单一记。 实现工具:Apache POI - the Java API for Microsoft Documents 官网:https://poi.apache.org/ HSSF - 提供读写Microsoft Excel XLS格式档案的功能。 XSSF - 提供读写Microsoft Excel OOXML XLSX格式档案的功能。 HWPF - 提供读写Microsoft Word DOC97格式档案的功能。 XWPF - 提供读写Microsoft Word DOC2003格式档案的功能。 HSLF - 提供读写Microsoft PowerPoint格式档案的功能。 HDGF - 提供读Microsoft Visio格式档案的功能。 HPBF - 提供读Microsoft Publisher格式档案的功能。 HSMF - 提供读Microsoft Outlook格式档案的功能。 下面的java程序是利用HSSF,实现excel导入功能: maven坐标: <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi<
  • 从java POI创建excel文件时出错(Error With creating an excel file from java POI)
    问题 嗨,我想从 Java 代码创建一个 excel 文件,我将此代码放在 Eclipse 上,但没有任何反应 import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import java.io.FileOutputStream; public class TestPOI1 { public static void main(String[] args) { //create the new workbook Workbook workbook = new HSSFWorkbook(); try { //create the output stream to save the document on the hard drive FileOutputStream output = new FileOutputStream("Test1.xls"); //write the file onto the hard drive workbook.write(output); //finish it up by closing the document output.close(); } catch(Exception e) { e
  • 重新定义命名的Excel范围,然后使用Apache POI保存(Redefine Named Excel Range then Save using Apache POI)
    问题 使用Apache POI,我可以找到一个命名范围: XSSFName[] ranges = new XSSFName[workbook.getNumberOfNames()]; for (int i = 0; i < _wb.getNumberOfNames(); i++) ranges[i] = workbook.getNameAt(i); 这样,我就可以对AreaReference进行单元格处理: AreaReference area = new AreaReference(ranges[0].getRefersToFormula()); 最后,我可以得到该范围内的所有单元格: CellReference[] cells = area.getAllReferencedCells(); 一切正常。 Burt我有一个用例,我必须重新定义范围覆盖的区域。 有没有办法做到这一点? 我注意到range.getRefersToFormula()方法返回一个String,类似于MySheet!$A$1:$B$8 。 有一个range.setRefersToFormula(String formula) ,但是我必须相信除了自己依靠自己编写一个Excel范围公式解析器外,还有其他方法。 有没有办法生成带有类型安全性更高的Cell引用集的AreaReference?
  • 无法使用 Apache POI 读取 Excel 2010 文件。 第一行编号为 -1(Can't read Excel 2010 file with Apache POI. First Row number is -1)
    问题 我正在使用 Apache POI API(当前版本 3-10-FINAL)尝试这个测试文件。 以下测试代码 import java.io.FileInputStream; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class ExcelTest { public static void main(String[] args) throws Exception { String filename = "testfile.xlsx"; XSSFWorkbook wb = new XSSFWorkbook(new FileInputStream(filename)); XSSFSheet sheet = wb.getSheetAt(0); System.out.println(sheet.getFirstRowNum()); } } 导致第一个行号为 -1(并且现有行返回为空)。 测试文件是由 Excel 2010 创建的(我无法控制那部分),可以使用 Excel 读取而不会出现警告或问题。 如果我用我的 Excel (2013) 版本打开并保存文件,它可以按预期完美读取。
  • 使用 Apache POI 在 Java 中编辑 Microsoft-office .doc 文件(Edit Microsoft-office .doc file in java using Apache POI)
    问题 我正在编写java代码来实现以下目标。 1.阅读给定的微软办公文档(.doc)文件。 2.在文件中搜索给定的字符串。 3.删除任意位置的给定字符串。 4.在指定位置插入或替换任何给定字符串。 5.将更新后的文件内容写入并保存到新的.doc文件中。 我已经编写了一个代码来读取、搜索、插入或替换、删除和保存文件,它运行良好,但我无法保留文本格式(例如字体颜色、字体大小、对齐方式、左右缩进) 、样式等)应用在输入文件中。 请任何人帮助我解决问题。 谢谢 回答1 我将添加用于设置Ms-Word 文档样式的新解决方案.. public class CreateDocumentFromScratch { public static void main(String[] args) { XWPFDocument document = new XWPFDocument(); XWPFParagraph paragraphOne = document.createParagraph(); paragraphOne.setAlignment(ParagraphAlignment.CENTER); paragraphOne.setBorderBottom(Borders.SINGLE); paragraphOne.setBorderTop(Borders.SINGLE); paragraphOne
  • 在没有 Apache POI 的情况下解析 Excel 文件(Parsing Excel file without Apache POI)
    问题 我知道我们可以使用 Apache POI 来解析 Excel 文件并获取数据。 但是我听说一个奇怪的事情,excel 文件可以以我们解析 CSV 的类似方式传递(就像从文件 Stream 中读取文件并用“逗号”分隔符分隔每个列值)。 当我们解析 Excel 时,我们必须使用制表符作为分隔符。 是否可以? 如果是,那么为什么 Apache 提出了如此复杂的框架。 我很困惑。 有人能帮我吗? 回答1 CSV 是一种文本格式,因此可以使用分隔符对其进行解析。 旧 Excel 是一种二进制和专有格式,因此需要巧妙的解码。 新的 Excel 格式是压缩的 XML,但在将其转换为像逐个读取单元格这样简单的内容之前,还应该了解该文档的结构。 所以你的问题的答案是否定的,你需要使用 Apache POI,而且 - 这没有任何问题。 附带说明一下,在成为一名优秀开发人员的道路上,在寻求帮助之前,您需要学会做一些自己的研究。 把手弄脏是最好的学习方法。 回答2 您可能混淆了您所听到的内容,或者告诉您的人感到困惑。 Excel 文件的某些部分可以(在某种程度上)存储为 CSV 文件,因为表格数据结构非常适合 CSV 文件格式。 但是,如果您以 CSV 格式保存,那么您只会在每个单元格中获得纯文本 - 您会丢失所有格式信息、任何图形、多个工作表等。 Apache POI 使用原生 XLS excel
  • Apache POI - 处理数据的部分无效(Apache POI - Invalid part to process data)
    问题 我使用 Java Apache POI ( hssf ) 访问 Excel 电子表格。 我收到以下错误: java.lang.RuntimeException: org.apache.poi.poifs.filesystem.OfficeXmlFileException: The supplied data appears to be in the Office 2007+ XML. You are calling the part of POI that deals with OLE2 Office Documents. You need to call a different part of POI to process this data (eg XSSF instead of HSSF) at org.testng.internal.MethodInvocationHelper.invokeDataProvider(MethodInvocationHelper.java:143) at org.testng.internal.Parameters.handleParameters(Parameters.java:426) 我错过了什么? 回答1 要打开xlsx (Office Open XML) 文件,您应该使用 XSSFWorkbook 而不是
  • 如何避免java.lang.NoClassDefFoundError(How to avoid java.lang.NoClassDefFoundError)
    问题 我有一个用于将文本添加到现有.doc文件中的代码,它将通过使用apache POI将其另存为另一个名称。 以下是到目前为止我尝试过的代码 import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import org.apache.poi.xwpf.model.XWPFHeaderFooterPolicy; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf.usermodel.XWPFFooter; import org.apache.poi.xwpf.usermodel.XWPFTable; public class FooterTableWriting { public static void main(String args[]) { String path="D:\\vignesh\\AgileDocTemplate.doc"; String attch="D:\\Attach.doc"; String comment="good"; String stat="ready"; String
  • Java 如何使用 JFileChooser 保存由 Apache POI 创建的 excel 文件(Java how to user JFileChooser to save a excel file created by Apache POI)
    问题 我想将电子表格文件保存到用户自定义文件夹,人们建议使用JFileChooser ,但我实际上不知道如何实现。 我在这里有我当前的示例代码: import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class Example { public static void main(String[] args) throws FileNotFoundException, IOException { XSSFWorkbook workbook; File file = new File("example.xlsx"); if (file.exists() == false) { workbook = new
  • 即使EXCEL java POI Apache中的行为空,也将数据保存到表并将其保存到数据库(Save the data to table and save it to database even if empty rows in EXCEL java POI Apache)
    问题 我不知道如何将内容保存在数据库中,我尝试导入它可以工作的 excel,但是如果 excel 行之一为空,则会出现 java.lang.IndexOutOfBoundsException -- 这是我的代码 -- -- 分支实体.java -- 公共类分支{ private static final long serialVersionUID = 1L; @Column(name = "branch_code", nullable = false, length = 10) private String branchCode; @Column(name = "branch_desc", nullable = false, length = 100) private String branchDescription; @OneToMany(mappedBy = "branch", cascade = CascadeType.ALL, fetch = FetchType.LAZY) @JsonIgnore private List<User> user; public Branch(String branchCode, String branchDescription, List<User> user) { super(); this.branchCode = branchCode