วิธีอ่านและเขียนไฟล์ excel


172

ฉันต้องการอ่านและเขียนไฟล์ Excel จาก Java ที่มี 3 คอลัมน์และ N แถวโดยพิมพ์หนึ่งสตริงในแต่ละเซลล์ ทุกคนสามารถให้ข้อมูลโค้ดง่ายๆให้ฉันได้ไหม ฉันจำเป็นต้องใช้ lib ภายนอกหรือ 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]

ด้วยGemBox สเปรดชีตสำหรับ Javaนี่เป็นเรื่องง่ายคุณแค่วนซ้ำแถวในแผ่นงานและผ่านเซลล์ที่จัดสรรในแถวและเรียกExcelCell.getValue()แต่ละแถว ตัวอย่างเช่นดูตัวอย่างการอ่านและการเขียนคุณสามารถตรวจสอบตัวอย่างนี้ได้
bellpatricia

คำตอบ:


144

ลอง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


15
row.getCell ((สั้น) c); เลิกฉันคิดว่าฉันต้องใช้ int แทน
DavidVdd

4
ในความเป็นจริงเพียงลบ cast (สั้น) poi.apache.org/apidocs/org/apache/poi/hssf/usermodel/…
nicolallias

1
ในความพยายามของฉันที่จะใช้รหัสนี้ผมพบว่าHSSFSheet's getPhysicalNumberOfRows()วิธีดูเหมือนจะกลับจำนวนแถวที่ไม่ว่างเปล่า (มันไม่ได้เป็นที่เห็นได้ชัดกับผมว่าเป็นสิ่งที่ 'กาย' หมาย) ดังนั้นถ้าแฟ้ม Excel ของคุณมีจำนวนมากของแถวที่ว่างเปล่า (เช่นการจัดรูปแบบเหตุผล) rows = sheet.getLastRowNum();คุณอาจมีโชคมากขึ้นโดยใช้ นี่ควรหมายความว่าคุณสามารถลบเคล็ดลับ (ดูความคิดเห็น) จากลูปแรก: for(int i = 0; i <= rows; i++) {(สังเกตการเปลี่ยนแปลงจาก<เป็น<=)
pearcemerritt

ขออภัยที่จะขุดอีกครั้ง แต่ฉันมีปัญหาเช่นนี้สมมติว่าคุณมี 3 คอลัมน์ชื่อวันเกิดเพศ คุณจะเพิ่ม 3 ตัวนั้นเพื่อแยก Vector โดยการอ่านด้วยรหัสนี้ได้อย่างไร
ชาวกะเหรี่ยง

ทำไมไม่มีใครให้ตัวเลือกใช้ JXI
Mahender Reddy Yasa

52

Apache POIสามารถทำสิ่งนี้ให้คุณได้ โดยเฉพาะโมดูลHSSF คำแนะนำอย่างเป็นประโยชน์มากที่สุด นี่คือวิธีการทำสิ่งที่คุณต้องการ - สร้างแผ่นงานโดยเฉพาะและเขียนออกมา

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();

37

ก่อนอื่นให้เพิ่มไฟล์ jar ทั้งหมดในพา ธ คลาสโปรเจ็กต์ของคุณ:

  1. POI-Scratchpad-3.7-20,101,029
  2. POI-3.2-FINAL-20081019
  3. POI-3.7-20,101,029
  4. POI-ตัวอย่าง-3.7-20,101,029
  5. POI-OOXML-3.7-20,101,029
  6. POI-OOXML-schemas-3.7-20,101,029
  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();
    }
}

14

นอกจากนี้คุณยังสามารถพิจารณาJExcelApi ฉันคิดว่ามันออกแบบได้ดีกว่า POI มีการกวดวิชาที่เป็นที่นี่


3
ฉันพยายามไปที่หน้าบทช่วยสอน ดูเหมือนว่าจะถูกลบออก
Vikram

4
JExcelApi ใช้สำหรับไฟล์. xls แบบไบนารี (สูงสุด Excel 2003) แบบเก่า Apache POI-HSSF กำลังพูดถึง. xls แบบเดิมในขณะที่ Apache POI-XSSF ทำงานร่วมกับใหม่ (Excel 2007-) .xlsx
MGM

14

มีเครื่องมือใหม่ที่ง่ายและยอดเยี่ยม (10x ถึง Kfir): 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();

11

สำหรับการอ่านไฟล์ xlsx เราสามารถใช้Apache POI libs ลองสิ่งนี้:

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();
        }

    }

9

csv หรือจุดที่น่าสนใจอย่างแน่นอนจะทำมัน แต่คุณควรจะตระหนักถึงแอนดี้ข่านJExcel ฉันคิดว่ามันเป็นห้องสมุด Java ที่ดีที่สุดสำหรับการทำงานกับ Excel ที่มีอยู่


6
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();
    }

และตรวจสอบให้แน่ใจว่าได้เพิ่ม jars poi และ poi-ooxml (org.apache.poi) ในโครงการของคุณ


4

ไฟล์ CSV แบบง่ายควรจะพอเพียง


2
ระวังว่าคุณจะต้องหลีกเลี่ยงจุลภาคในสายที่คุณเขียนถึง CSV
Brian Agnew

แท้จริงแล้ว CSV ก็เพียงพอแล้ว หากเขตข้อมูลของคุณไม่มีเครื่องหมายจุลภาคเป็นไปได้ง่ายที่สุดในการพิมพ์เขตข้อมูลและเครื่องหมายจุลภาค มิฉะนั้นคุณอาจต้องการใช้commons.apache.org/sandbox/csv
Yuval F

2
ฉันไม่แน่ใจว่า CSV เป็นพอตั้งแต่คำถามเฉพาะว่า 'อ่าน' และ 'เขียน' แฟ้ม Excel เขาอาจหนีจาก CSV แต่นั่นไม่ใช่สิ่งที่เขาขอ
Brian Agnew

Excel รุ่นสากลบางรุ่นใช้เครื่องหมายอัฒภาคแทนเครื่องหมายจุลภาคเป็นตัวคั่น สิ่งนี้ยังเพิ่มความซับซ้อน
Roalt

หากผลลัพธ์มี CSV วันที่อาจจะง่ายเกินไป
Thorbjørn Ravn Andersen

3

สำหรับการอ่านข้อมูลจากสมุดงาน. 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


ด้วย Apache POI คุณต้องใช้โมดูล HSSF สำหรับโมดูล XLS และ XSSF สำหรับรูปแบบ XLSX โดยGemBox.Spreadsheet สำหรับ Javaทั้งสองรูปแบบจะรวมเป็นโมดูลเดียวกันและแสดงด้วย ExcelFile ชนิดเดียวกัน
NixonUposseen

3

แน่นอนว่าคุณจะพบรหัสด้านล่างมีประโยชน์และง่ายต่อการอ่านและเขียน นี่คือ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);

    }

}

}

2

ใช้ spring apache poi repo

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();
                }
            }

1

ฉันแก้ไขคนที่โหวตมากที่สุดเพราะมันไม่ได้นับช่องว่างคอลัมน์หรือแถวไม่ดีทั้งหมดดังนั้นนี่คือรหัสของฉันฉันทดสอบและตอนนี้สามารถรับเซลล์ใด ๆ ในส่วนของไฟล์ 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();}

1

หากหมายเลขคอลัมน์เป็น varing คุณสามารถใช้สิ่งนี้

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();
    }
}

การอ้างอิงที่สอดคล้องกันสามารถพบได้ที่นี่


varing, varing เหนือ baring
Roel

1

คุณต้องใช้ Apache POI ไลบรารี่และรหัสด้านล่างนี้จะช่วยคุณได้

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Iterator;
    //*************************************************************
    import org.apache.poi.ss.usermodel.Sheet;
    import org.apache.poi.ss.usermodel.Cell;
    import org.apache.poi.ss.usermodel.Row;
    import org.apache.poi.ss.usermodel.Workbook;
    import org.apache.poi.xssf.usermodel.XSSFSheet;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;

    //*************************************************************
   public class AdvUse {

    private static Workbook wb ; 
    private static Sheet sh ; 
    private static FileInputStream fis ; 
    private static FileOutputStream fos  ; 
    private static Row row  ; 
    private static Cell cell  ;
    private static String ExcelPath ; 

    //*************************************************************
    public static void setEcxelFile(String ExcelPath, String SheetName) throws Exception {
    try {
   File f= new File(ExcelPath); 
   if(!f.exists()){
       f.createNewFile();
       System.out.println("File not Found so created");
   }

    fis = new FileInputStream("./testData.xlsx");
    wb = WorkbookFactory.create(fis); 
    sh = wb.getSheet("SheetName");
    if(sh == null){
        sh = wb.getSheet(SheetName); 
    }
    }catch(Exception e)
    {System.out.println(e.getMessage());
    }
    }

      //*************************************************************
      public static void setCellData(String text , int rowno , int colno){
    try{
        row = sh.getRow(rowno);
        if(row == null){
            row = sh.createRow(rowno);
        }
        cell = row.getCell(colno);
        if(cell!=null){
            cell.setCellValue(text);

        }
        else{
            cell = row.createCell(colno);
            cell.setCellValue(text);

        }
        fos = new FileOutputStream(ExcelPath);
        wb.write(fos);
        fos.flush();
        fos.close();
    }catch(Exception e){
        System.out.println(e.getMessage());
    }
    }

      //*************************************************************
      public static String getCellData(int rowno , int colno){
        try{

            cell = sh.getRow(rowno).getCell(colno); 
            String CellData = null ;
            switch(cell.getCellType()){
            case  STRING :
                CellData = cell.getStringCellValue();
               break ; 
            case NUMERIC : 
                CellData = Double.toString(cell.getNumericCellValue());
                if(CellData.contains(".o")){
                    CellData = CellData.substring(0,CellData.length()-2);

                }
            break ; 
            case BLANK : 
            CellData = ""; break ; 

            }
            return CellData;
        }catch(Exception e){return ""; }
    }

       //*************************************************************
      public static int getLastRow(){
        return sh.getLastRowNum();
    }

0

อีกวิธีหนึ่งในการอ่าน / เขียนไฟล์ Excel คือการใช้Windmill Windmillมันมี 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"));

0

คุณไม่สามารถอ่านและเขียนไฟล์เดียวกันแบบขนาน ( ล็อคอ่าน - เขียน ) แต่เราสามารถดำเนินการขนานกับข้อมูลชั่วคราว (เช่นอินพุต / เอาต์พุตสตรีม) เขียนข้อมูลไปยังไฟล์หลังจากปิดอินพุตสตรีมเท่านั้น ขั้นตอนด้านล่างควรทำตาม

  • เปิดไฟล์เพื่อสตรีมอินพุต
  • เปิดไฟล์เดียวกันกับเอาต์พุตสตรีม
  • อ่านและทำการประมวลผล
  • เขียนเนื้อหาไปยังเอาต์พุตสตรีม
  • ปิดสตรีมการอ่าน / อินพุตปิดไฟล์
  • ปิดสตรีมเอาต์พุต, ปิดไฟล์

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();
        }
    }
}

0

โปรดใช้ Apache POI libs และลองสิ่งนี้

    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();
    }
   }
}

0

เมื่อใช้ apache poi 4.1.2 เซลล์ชนิดเปลี่ยนแปลงเล็กน้อย ด้านล่างเป็นตัวอย่าง

    try {
        File excel = new File("/home/name/Downloads/bb.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();

            Iterator<Cell> cellIterator = row.cellIterator();
            while (cellIterator.hasNext()) {



                Cell cell = cellIterator.next();



                switch (cell.getCellType()) {
                case STRING:
                    System.out.print(cell.getStringCellValue() + "\t");
                    break;
                case NUMERIC:
                    System.out.print(cell.getNumericCellValue() + "\t");
                    break;
                case BOOLEAN:
                    System.out.print(cell.getBooleanCellValue() + "\t");
                    break;
                default:


                }
            }
            System.out.println("");}
        }catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }

-1

หากคุณต้องการทำอะไรเพิ่มเติมกับเอกสาร office ใน 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();
 }
}

-1

สิ่งนี้จะเขียน JTable ไปยังไฟล์ที่คั่นด้วยแท็บที่สามารถนำเข้าสู่ Excel ได้อย่างง่ายดาย วิธีนี้ใช้ได้ผล

หากคุณบันทึกแผ่นงาน Excel เป็นเอกสาร XML คุณสามารถสร้างไฟล์ XML สำหรับ EXCEL ด้วยรหัสได้ ฉันทำสิ่งนี้ด้วยคำพูดเพื่อที่คุณไม่ต้องใช้แพ็คเกจของบุคคลที่สาม

โค้ดนี้สามารถนำ 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"));
    }
}

(คุณเพียงแค่เก็บ String String ใน JTable และรับ Strings สำหรับการเขียนไฟล์ "CSV" ที่คั่นด้วยแท็บ JTable นั้นไม่จำเป็นในอัลกอริทึมนี้ ... )
MGM
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.