【问题标题】:Creating and Editing Excel Documents (.csv) with Java使用 Java 创建和编辑 Excel 文档 (.csv)
【发布时间】:2011-03-09 05:17:13
【问题描述】:

对于我正在进行的这个项目,我想获取多张 Excel 表格,然后将它们合并为一张,随意处理数据以使所有内容更具可读性。

打开文件、读取内容、存储内容、创建新文件 (.csv),然后将信息粘贴到我选择的组织中的最佳方式是什么?

我绝对需要坚持使用 java,因为这将是预先存在的自动化流程的一部分,我不想将所有内容都更改为另一种语言。

有没有我应该知道的有用的软件包?

非常感谢

贾斯蒂安

【问题讨论】:

  • Excel 文件远不止 CSV。 CSV 到 Excel 就像一个文本文件到 Word。

标签: java excel file csv package


【解决方案1】:

据我所知,csv 不是特定于 excel 的,而只是一个“comma-separated values”文件。

所以this 可能会对你有所帮助。

【讨论】:

  • 是的。确实如此。 CSV 并非特定于 excel,但我想大多数人会理解如果我将它与一个通用程序相关联会更好。这看起来很棒,虽然有点混乱。我正在调查。
【解决方案2】:

出于显而易见的原因,编写 CSV 文件通常非常简单。您可以编写自己的辅助类来完成它。需要注意的是确保您在任何输出中都没有分隔符。

读取 CSV 比较棘手。没有像 Python 那样的标准库(一种更好的语言,恕我直言,用于进行 CSV 处理),但如果您搜索它,周围有很多不错的免费实现。

最大的问题是程序的内部表示:根据输入和输出的大小,将所有内容都保存在内存中可能是不可能的。你能一口气做完所有事情吗? (我的意思是,读一些,写一些,等等)

您可能还想使用稀疏表示,而不仅仅是表示数组中的所有电子表格。

【讨论】:

  • 读一些,写一些绝对是我希望做的。只是,据我所知,编辑现有文件并没有太大的灵活性,只需使用您选择的内容创建一个。
  • “编辑”现有文件是什么意思?当您创建一个新版本时,即使是 excel 也会简单地替换该版本。使用适当的 API 或设计,您可以编写一些“复制”文件并在相关时引入更改的东西,例如基于事件的解析器。
  • 假设我不想在我的程序中保存所有数据。我会使用起始行/值创建文件,然后在我想添加它时重新打开它。当然,我必须评估效率。存储更多数据与打开/写入。
【解决方案3】:

我认为 Excel 中的任何严肃工作都应该考虑Joel's 解决方案,让 Office 在您需要时远程调用的 Windows 机器上为您完成。但是,如果您的需求足够简单,或者您确实需要纯 Java 解决方案,那么 Apache 的 POI 库就足够了。

【讨论】:

    【解决方案4】:

    也许你应该试试这个: Jxcell,是一个java电子表格组件,可以读/写/编辑所有xls/xlsx/csv文件。

    【讨论】:

    • 谢谢,但这不是我想要的。那是一个用 Java 制作的电子表格程序。我需要一些可以与 Java 一起使用的东西。
    【解决方案5】:

    试试这个代码

        import java.util.*;
        import java.util.Map.Entry;
        import java.util.concurrent.TimeoutException;
        import java.util.logging.Logger;
        import java.util.logging.Level;
        import java.util.logging.Logger;
        import org.apache.poi.ss.usermodel.*;
        import org.apache.poi.hssf.usermodel.HSSFWorkbook;
        import org.apache.poi.xssf.usermodel.XSSFWorkbookFactory;
    
        public class App {
    
            public void convertExcelToCSV(Sheet sheet, String sheetName) {
                StringBuffer data = new StringBuffer();
                try {
                    FileOutputStream fos = new FileOutputStream("C:\\Users\\" + sheetName + ".csv");
                    Cell cell;
                    Row row;
    
                    Iterator<Row> rowIterator = sheet.iterator();
                    while (rowIterator.hasNext()) {
                        row = rowIterator.next();
                        Iterator<Cell> cellIterator = row.cellIterator();
                        while (cellIterator.hasNext()) {
                            cell = cellIterator.next();
    
                            CellType type = cell.getCellTypeEnum();
                            if (type == CellType.BOOLEAN) {
                                data.append(cell.getBooleanCellValue() + ",");
                            } else if (type == CellType.NUMERIC) {
                                data.append(cell.getNumericCellValue() + ",");
                            } else if (type == CellType.STRING) {
                                data.append(cell.getStringCellValue() + ",");
                            } else if (type == CellType.BLANK) {
                                data.append("" + ",");
                            } else {
                                data.append(cell + ",");
                            }
                        }
                        data.append('\n');
                    }
                    fos.write(data.toString().getBytes());
                    fos.close();
                }
                catch (FileNotFoundException e)
                {
                    e.printStackTrace();
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                }
            }
    
            public static void main(String [] args)
            {
                App app = new App();
                String path =  "C:\\Users\\myFile.xlsx";
                InputStream inp = null;
                try {
                    inp = new FileInputStream(path);
                    Workbook wb = WorkbookFactory.create(inp);
    
                    for(int i=0;i<wb.getNumberOfSheets();i++) {
                        System.out.println(wb.getSheetAt(i).getSheetName());
                        app.convertExcelToCSV(wb.getSheetAt(i),wb.getSheetAt(i).getSheetName());
                    }
                } catch (Exception ex) {
                    System.out.println(ex.getMessage());
                } 
                finally {
                    try {
                        inp.close();
                    } catch (Exception ex) {
                        System.out.println(ex.getMessage());
                    }
                }
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多