如何读写excel文件

我想从Java读取和写入一个Excel文件,使用3列和N行,在每个单元格中打印一个string。 任何人都可以给我这个简单的代码片段? 我需要使用任何外部库还是Java有内置的支持?

我想要做到以下几点:

for(i=0; i <rows; i++) //read [i,col1] ,[i,col2], [i,col3] for(i=0; i<rows; i++) //write [i,col1], [i,col2], [i,col3] 

试试Apache POI HSSF 。 这里是一个关于如何读取excel文件的例子:

 try { POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(file)); HSSFWorkbook wb = new HSSFWorkbook(fs); HSSFSheet sheet = wb.getSheetAt(0); HSSFRow row; HSSFCell cell; int rows; // No of rows rows = sheet.getPhysicalNumberOfRows(); int cols = 0; // No of columns int tmp = 0; // This trick ensures that we get the data properly even if it doesn't start from first few rows for(int i = 0; i < 10 || i < rows; i++) { row = sheet.getRow(i); if(row != null) { tmp = sheet.getRow(i).getPhysicalNumberOfCells(); if(tmp > cols) cols = tmp; } } for(int r = 0; r < rows; r++) { row = sheet.getRow(r); if(row != null) { for(int c = 0; c < cols; c++) { cell = row.getCell((short)c); if(cell != null) { // Your code here } } } } } catch(Exception ioe) { ioe.printStackTrace(); } 

在文档页面上,您还有如何写入excel文件的示例。

Apache POI可以为你做到这一点。 特别是HSSF模块。 快速指南是最有用的。 以下是如何做你想做的 – 专门创build一个工作表并写出来。

  Workbook wb = new HSSFWorkbook(); //Workbook wb = new XSSFWorkbook(); CreationHelper createHelper = wb.getCreationHelper(); Sheet sheet = wb.createSheet("new sheet"); // Create a row and put some cells in it. Rows are 0 based. Row row = sheet.createRow((short)0); // Create a cell and put a value in it. Cell cell = row.createCell(0); cell.setCellValue(1); // Or do it on one line. row.createCell(1).setCellValue(1.2); row.createCell(2).setCellValue( createHelper.createRichTextString("This is a string")); row.createCell(3).setCellValue(true); // Write the output to a file FileOutputStream fileOut = new FileOutputStream("workbook.xls"); wb.write(fileOut); fileOut.close(); 

首先将所有这些jar文件添加到您的项目类path中:

  1. POI暂存器,3.7-20101029
  2. POI-3.2-FINAL-20081019
  3. POI-3.7-20101029
  4. POI-例子-3.7-20101029
  5. POI-OOXML-3.7-20101029
  6. POI-OOXML-架构 – 3.7-20101029
  7. XMLBeans的-2.3.0
  8. dom4j的-1.6.1

用于写入excel文件的代码:

 public static void main(String[] args) { //Blank workbook XSSFWorkbook workbook = new XSSFWorkbook(); //Create a blank sheet XSSFSheet sheet = workbook.createSheet("Employee Data"); //This data needs to be written (Object[]) Map<String, Object[]> data = new TreeMap<String, Object[]>(); data.put("1", new Object[]{"ID", "NAME", "LASTNAME"}); data.put("2", new Object[]{1, "Amit", "Shukla"}); data.put("3", new Object[]{2, "Lokesh", "Gupta"}); data.put("4", new Object[]{3, "John", "Adwards"}); data.put("5", new Object[]{4, "Brian", "Schultz"}); //Iterate over data and write to sheet Set<String> keyset = data.keySet(); int rownum = 0; for (String key : keyset) { //create a row of excelsheet Row row = sheet.createRow(rownum++); //get object array of prerticuler key Object[] objArr = data.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 Integer) { cell.setCellValue((Integer) obj); } } } try { //Write the workbook in file system FileOutputStream out = new FileOutputStream(new File("C:\\Documents and Settings\\admin\\Desktop\\imp data\\howtodoinjava_demo.xlsx")); workbook.write(out); out.close(); System.out.println("howtodoinjava_demo.xlsx written successfully on disk."); } catch (Exception e) { e.printStackTrace(); } } 

从excel文件读取代码

 /* * To change this template, choose Tools | Templates * and open the template in the editor. */ public static void main(String[] args) { try { FileInputStream file = new FileInputStream(new File("C:\\Documents and Settings\\admin\\Desktop\\imp data\\howtodoinjava_demo.xlsx")); //Create Workbook instance holding reference to .xlsx file XSSFWorkbook workbook = new XSSFWorkbook(file); //Get first/desired sheet from the workbook XSSFSheet sheet = workbook.getSheetAt(0); //Iterate through each rows one by one Iterator<Row> rowIterator = sheet.iterator(); while (rowIterator.hasNext()) { Row row = rowIterator.next(); //For each row, iterate through all the columns Iterator<Cell> cellIterator = row.cellIterator(); while (cellIterator.hasNext()) { Cell cell = cellIterator.next(); //Check the cell type and format accordingly switch (cell.getCellType()) { case Cell.CELL_TYPE_NUMERIC: System.out.print(cell.getNumericCellValue() + "\t"); break; case Cell.CELL_TYPE_STRING: System.out.print(cell.getStringCellValue() + "\t"); break; } } System.out.println(""); } file.close(); } catch (Exception e) { e.printStackTrace(); } } 

你也可以考虑JExcelApi 。 我觉得它比POIdevise得更好。 这里有一个教程。

.csv或者POI肯定会做到,但是你应该知道Andy Khan的JExcel 。 我认为这是迄今为止最好的使用Excel的Java库。

 String path="C:\\Book2.xlsx"; try { File f = new File( path ); Workbook wb = WorkbookFactory.create(f); Sheet mySheet = wb.getSheetAt(0); Iterator<Row> rowIter = mySheet.rowIterator(); for ( Iterator<Row> rowIterator = mySheet.rowIterator() ;rowIterator.hasNext(); ) { for ( Iterator<Cell> cellIterator = ((Row)rowIterator.next()).cellIterator() ; cellIterator.hasNext() ; ) { System.out.println ( ( (Cell)cellIterator.next() ).toString() ); } System.out.println( " **************************************************************** "); } } catch ( Exception e ) { System.out.println( "exception" ); e.printStackTrace(); } 

并确保已添加jar子poi和poi-ooxml(org.apache.poi)到您的项目

有一个新的简单而且非常酷的工具(Kfir的10​​倍): xcelite

写:

 public class User { @Column (name="Firstname") private String firstName; @Column (name="Lastname") private String lastName; @Column private long id; @Column private Date birthDate; } Xcelite xcelite = new Xcelite(); XceliteSheet sheet = xcelite.createSheet("users"); SheetWriter<User> writer = sheet.getBeanWriter(User.class); List<User> users = new ArrayList<User>(); // ...fill up users writer.write(users); xcelite.write(new File("users_doc.xlsx")); 

读:

 Xcelite xcelite = new Xcelite(new File("users_doc.xlsx")); XceliteSheet sheet = xcelite.getSheet("users"); SheetReader<User> reader = sheet.getBeanReader(User.class); Collection<User> users = reader.read(); 

一个简单的CSV文件应该就足够了

对于读取xlsx文件,我们可以使用Apache POI库试试这个:

 public static void readXLSXFile() throws IOException { InputStream ExcelFileToRead = new FileInputStream("C:/Test.xlsx"); XSSFWorkbook wb = new XSSFWorkbook(ExcelFileToRead); XSSFWorkbook test = new XSSFWorkbook(); XSSFSheet sheet = wb.getSheetAt(0); XSSFRow row; XSSFCell cell; Iterator rows = sheet.rowIterator(); while (rows.hasNext()) { row=(XSSFRow) rows.next(); Iterator cells = row.cellIterator(); while (cells.hasNext()) { cell=(XSSFCell) cells.next(); if (cell.getCellType() == XSSFCell.CELL_TYPE_STRING) { System.out.print(cell.getStringCellValue()+" "); } else if(cell.getCellType() == XSSFCell.CELL_TYPE_NUMERIC) { System.out.print(cell.getNumericCellValue()+" "); } else { //U Can Handel Boolean, Formula, Errors } } System.out.println(); } } 

为了从.xlsx工作簿读取数据,我们需要使用XSSFworkbook类。

XSSFWorkbook xlsxBook = new XSSFWorkbook(fis);

XSSFSheet sheet = xlsxBook.getSheetAt(0); 等等

我们需要使用Apache-poi 3.9 @ http://poi.apache.org/

有关示例的详细信息,请访问: http : //java-recent.blogspot.in

当然,你会发现下面的代码有用,易于阅读和写作。 这是一个util类,你可以在你的主要方法中使用,然后你可以使用下面的所有方法。

  public class ExcelUtils { private static XSSFSheet ExcelWSheet; private static XSSFWorkbook ExcelWBook; private static XSSFCell Cell; private static XSSFRow Row; File fileName = new File("C:\\Users\\satekuma\\Pro\\Fund.xlsx"); public void setExcelFile(File Path, String SheetName) throws Exception try { FileInputStream ExcelFile = new FileInputStream(Path); ExcelWBook = new XSSFWorkbook(ExcelFile); ExcelWSheet = ExcelWBook.getSheet(SheetName); } catch (Exception e) { throw (e); } } public static String getCellData(int RowNum, int ColNum) throws Exception { try { Cell = ExcelWSheet.getRow(RowNum).getCell(ColNum); String CellData = Cell.getStringCellValue(); return CellData; } catch (Exception e) { return ""; } } public static void setCellData(String Result, int RowNum, int ColNum, File Path) throws Exception { try { Row = ExcelWSheet.createRow(RowNum - 1); Cell = Row.createCell(ColNum - 1); Cell.setCellValue(Result); FileOutputStream fileOut = new FileOutputStream(Path); ExcelWBook.write(fileOut); fileOut.flush(); fileOut.close(); } catch (Exception e) { throw (e); } } } 

我编辑了最有投票的一个小cuz它没有计算空白列或行不完全,所以这里是我的代码我testing它,现在可以得到任何单元格的任何部分的Excel文件。 现在你也可以在填充的列之间有空格列,它会读取它们

  try { POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(Dir)); HSSFWorkbook wb = new HSSFWorkbook(fs); HSSFSheet sheet = wb.getSheetAt(0); HSSFRow row; HSSFCell cell; int rows; // No of rows rows = sheet.getPhysicalNumberOfRows(); int cols = 0; // No of columns int tmp = 0; int cblacks=0; // This trick ensures that we get the data properly even if it doesn't start from first few rows for(int i = 0; i <= 10 || i <= rows; i++) { row = sheet.getRow(i); if(row != null) { tmp = sheet.getRow(i).getPhysicalNumberOfCells(); if(tmp >= cols) cols = tmp;else{rows++;cblacks++;} } cols++; } cols=cols+cblacks; for(int r = 0; r < rows; r++) { row = sheet.getRow(r); if(row != null) { for(int c = 0; c < cols; c++) { cell = row.getCell(c); if(cell != null) { System.out.print(cell+"\n");//Your Code here } } } }} catch(Exception ioe) { ioe.printStackTrace();} 

如果列号正在变化,你可以使用这个

 package com.org.tests; import org.apache.poi.xssf.usermodel.*; import java.io.FileInputStream; import java.io.IOException; public class ExcelSimpleTest { String path; public FileInputStream fis = null; private XSSFWorkbook workbook = null; private XSSFSheet sheet = null; private XSSFRow row =null; private XSSFCell cell = null; public ExcelSimpleTest() throws IOException { path = System.getProperty("user.dir")+"\\resources\\Book1.xlsx"; fis = new FileInputStream(path); workbook = new XSSFWorkbook(fis); sheet = workbook.getSheetAt(0); } public void ExelWorks() { int index = workbook.getSheetIndex("Sheet1"); sheet = workbook.getSheetAt(index); int rownumber=sheet.getLastRowNum()+1; for (int i=1; i<rownumber; i++ ) { row = sheet.getRow(i); int colnumber = row.getLastCellNum(); for (int j=0; j<colnumber; j++ ) { cell = row.getCell(j); System.out.println(cell.getStringCellValue()); } } } public static void main(String[] args) throws IOException { ExcelSimpleTest excelwork = new ExcelSimpleTest(); excelwork.ExelWorks(); } } 

相应的mavendependency可以在这里find

请使用Apache POI库并尝试此操作。

 public class TakingDataFromExcel { public static void main(String[] args) { try { FileInputStream x = new FileInputStream(new File("/Users/rajesh/Documents/rajesh.xls")); //Create Workbook instance holding reference to .xlsx file Workbook workbook = new HSSFWorkbook(x); //Get first/desired sheet from the workbook Sheet sheet = workbook.getSheetAt(0); //Iterate through each rows one by one for (Iterator<Row> iterator = sheet.iterator(); iterator.hasNext();) { Row row = (Row) iterator.next(); for (Iterator<Cell> iterator2 = row.iterator(); iterator2 .hasNext();) { Cell cell = (Cell) iterator2.next(); System.out.println(cell.getStringCellValue()); } } x.close(); } catch (Exception e) { e.printStackTrace(); } } } 

使用spring的Apache poi回购

 if (fileName.endsWith(".xls")) { File myFile = new File("file location" + fileName); FileInputStream fis = new FileInputStream(myFile); org.apache.poi.ss.usermodel.Workbook workbook = null; try { workbook = WorkbookFactory.create(fis); } catch (InvalidFormatException e) { e.printStackTrace(); } org.apache.poi.ss.usermodel.Sheet sheet = workbook.getSheetAt(0); Iterator<Row> rowIterator = sheet.iterator(); while (rowIterator.hasNext()) { Row row = rowIterator.next(); 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()); break; case Cell.CELL_TYPE_BOOLEAN: System.out.print(cell.getBooleanCellValue()); break; case Cell.CELL_TYPE_NUMERIC: System.out.print(cell.getNumericCellValue()); break; } System.out.print(" - "); } System.out.println(); } } 

读取/写入Excel文件的另一种方法是使用Windmill 。 它提供了一个stream畅的API来处理Excel和CSV文件。

导入数据

 try (Stream<Row> rowStream = Windmill.parse(FileSource.of(new FileInputStream("myFile.xlsx")))) { rowStream // skip the header row that contains the column names .skip(1) .forEach(row -> { System.out.println( "row n°" + row.rowIndex() + " column 'User login' value : " + row.cell("User login").asString() + " column n°3 number value : " + row.cell(2).asDouble().value() // index is zero-based ); }); } 

导出数据

 Windmill .export(Arrays.asList(bean1, bean2, bean3)) .withHeaderMapping( new ExportHeaderMapping<Bean>() .add("Name", Bean::getName) .add("User login", bean -> bean.getUser().getLogin()) ) .asExcel() .writeTo(new FileOutputStream("Export.xlsx")); 

如果您需要在Java中使用办公文档做更多事情,请按照上述提供POI。

为了简单的读取/写入您所要求的Excel文档,您可以使用CSV格式(也可以提到):

 import java.io.BufferedReader; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.util.Scanner; public class CsvWriter { public static void main(String args[]) throws IOException { String fileName = "test.xls"; PrintWriter out = new PrintWriter(new FileWriter(fileName)); out.println("a,b,c,d"); out.println("e,f,g,h"); out.println("i,j,k,l"); out.close(); BufferedReader in = new BufferedReader(new FileReader(fileName)); String line = null; while ((line = in.readLine()) != null) { Scanner scanner = new Scanner(line); String sep = ""; while (scanner.hasNext()) { System.out.println(sep + scanner.next()); sep = ","; } } in.close(); } } 

这会将一个JTable写入一个可以轻松导入到Excel中的制表符分隔文件。 这工作。

如果将Excel工作表另存为XML文档,则还可以使用代码构buildEXCEL的XML文件。 我已经这样做了,所以你不必使用第三方软件包。

这可能导致代码将JTable取出,然后只写一个分隔到任何文本文件的选项卡,然后导入到Excel中。 我希望这有帮助。

码:

 import java.io.File; import java.io.FileWriter; import java.io.IOException; import javax.swing.JTable; import javax.swing.table.TableModel; public class excel { String columnNames[] = { "Column 1", "Column 2", "Column 3" }; // Create some data String dataValues[][] = { { "12", "234", "67" }, { "-123", "43", "853" }, { "93", "89.2", "109" }, { "279", "9033", "3092" } }; JTable table; excel() { table = new JTable( dataValues, columnNames ); } public void toExcel(JTable table, File file){ try{ TableModel model = table.getModel(); FileWriter excel = new FileWriter(file); for(int i = 0; i < model.getColumnCount(); i++){ excel.write(model.getColumnName(i) + "\t"); } excel.write("\n"); for(int i=0; i< model.getRowCount(); i++) { for(int j=0; j < model.getColumnCount(); j++) { excel.write(model.getValueAt(i,j).toString()+"\t"); } excel.write("\n"); } excel.close(); }catch(IOException e){ System.out.println(e); } } public static void main(String[] o) { excel cv = new excel(); cv.toExcel(cv.table,new File("C:\\Users\\itpr13266\\Desktop\\cs.tbv")); } }