java - 可以在同一个 xls 表上读取和写入吗?

标签 java apache-poi jxl

我正在使用 JXl 进行 xls 读取,有什么方法可以在同一个 excel 表中读取和写入,我在 selenium 项目中使用,在读取我想在该 excel 表中写入的每一行后,我的测试数据位于 xls 表中。

最佳答案

您无法并行读写同一文件( Read-write lock )。但是,我们可以对临时数据(即输入/输出流)进行并行操作。仅在关闭输入流后才将数据写入文件。应遵循以下步骤。

  • 打开文件到输入流
  • 将同一文件打开到输出流
  • 读取并进行处理
  • 将内容写入输出流。
  • 关闭读取/输入流,关闭文件
  • 关闭输出流,关闭文件。

示例代码:

File inputFile = new File("D://"+file_name);
File outputFile = new File("D://"+file_name);
Workbook readCopy = Workbook.getWorkbook(inputFile);
WritableWorkbook writeCopy = Workbook.createWorkbook(outputFile,readCopy);

// instructions to put content in specific rows, specific columns

readCopy.close();    
inputFile.close();
writeCopy.write();
writeCopy.close();
outputFile.close();

Apache POI - 读/写相同的 Excel 示例

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.sql.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;


public class XLSXReaderWriter {

    public static void main(String[] args) {

        try {
            File excel = new File("D://raju.xlsx");
            FileInputStream fis = new FileInputStream(excel);
            XSSFWorkbook book = new XSSFWorkbook(fis);
            XSSFSheet sheet = book.getSheetAt(0);

            Iterator<Row> itr = sheet.iterator();

            // Iterating over Excel file in Java
            while (itr.hasNext()) {
                Row row = itr.next();

                // Iterating over each column of Excel file
                Iterator<Cell> cellIterator = row.cellIterator();
                while (cellIterator.hasNext()) {

                    Cell cell = cellIterator.next();

                    switch (cell.getCellType()) {
                    case Cell.CELL_TYPE_STRING:
                        System.out.print(cell.getStringCellValue() + "\t");
                        break;
                    case Cell.CELL_TYPE_NUMERIC:
                        System.out.print(cell.getNumericCellValue() + "\t");
                        break;
                    case Cell.CELL_TYPE_BOOLEAN:
                        System.out.print(cell.getBooleanCellValue() + "\t");
                        break;
                    default:

                    }
                }
                System.out.println("");
            }

            // writing data into XLSX file
            Map<String, Object[]> newData = new HashMap<String, Object[]>();
            newData.put("1", new Object[] { 1d, "Raju", "75K", "dev",
                    "SGD" });
            newData.put("2", new Object[] { 2d, "Ramesh", "58K", "test",
                    "USD" });
            newData.put("3", new Object[] { 3d, "Ravi", "90K", "PMO",
                    "INR" });

            Set<String> newRows = newData.keySet();
            int rownum = sheet.getLastRowNum();

            for (String key : newRows) {
                Row row = sheet.createRow(rownum++);
                Object[] objArr = newData.get(key);
                int cellnum = 0;
                for (Object obj : objArr) {
                    Cell cell = row.createCell(cellnum++);
                    if (obj instanceof String) {
                        cell.setCellValue((String) obj);
                    } else if (obj instanceof Boolean) {
                        cell.setCellValue((Boolean) obj);
                    } else if (obj instanceof Date) {
                        cell.setCellValue((Date) obj);
                    } else if (obj instanceof Double) {
                        cell.setCellValue((Double) obj);
                    }
                }
            }

            // open an OutputStream to save written data into Excel file
            FileOutputStream os = new FileOutputStream(excel);
            book.write(os);
            System.out.println("Writing on Excel file Finished ...");

            // Close workbook, OutputStream and Excel file to prevent leak
            os.close();
            book.close();
            fis.close();

        } catch (FileNotFoundException fe) {
            fe.printStackTrace();
        } catch (IOException ie) {
            ie.printStackTrace();
        }
    }
}

关于java - 可以在同一个 xls 表上读取和写入吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35825530/

相关文章:

java - Android:无法在文件中保存超过 195 的数字

java - 如何从 Apache POI 获取脚注和段落?

java - sheet.getLastRowNum() 给出不同的值

java - 如何使用java从Excel单元格中获取超链接地址?

java - 如何在Excel工作表中查找表格数据

java - 修改 HTTP 头并重定向到其他 Web 应用程序(跨应用程序)

java - 显示 Hibernate SQL 的 Logback 记录器必须大写

apache-poi - 如何使用 Apache POI API 检查 Excel 单元格是否被锁定?

java - jexcel API 中的 IndexOutOfBoundsException

java - 如何使用用户数据更新 JavaFX 中的 TreeView