有選擇讀取word表格中的資料並寫入excel檔案中
阿新 • • 發佈:2018-12-18
-
最近學院要舉行科技報告會活動,許多同學積極參與,交了許多報名表到我這裡,而我需要將這些資訊進行彙總,整理出一個excel表格,看著一個個word檔案放在我的工作資料夾中頭髮發麻,這一個個的整理好麻煩,不但速度慢而且容易出錯,我就想用程式設計自動替我讀取資料並寫入目標檔案。結果還真讓我寫成了,下面一一講解步驟:
-
問題描述:如下圖所示,我需要提取姓名、學號、合作者、學院及專業、聯絡方式、指導老師、參選題目這幾欄的資訊。
-
步驟一:下載POI外掛 POI:下載地址;我所使用的是poi-3.10-FINAL。建好java工程後右鍵點選,選擇配置選項,按照下面圖片步驟。
-
程式碼解釋
package readInformation; 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 org.apache.poi.POIXMLProperties.CoreProperties; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.hwpf.HWPFDocument; import org.apache.poi.hwpf.usermodel.Paragraph; import org.apache.poi.hwpf.usermodel.Range; import org.apache.poi.hwpf.usermodel.Table; import org.apache.poi.hwpf.usermodel.TableCell; import org.apache.poi.hwpf.usermodel.TableIterator; import org.apache.poi.hwpf.usermodel.TableRow; import org.apache.poi.poifs.filesystem.POIFSFileSystem; import org.apache.poi.xwpf.extractor.XWPFWordExtractor; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf.usermodel.XWPFTable; import org.apache.poi.xwpf.usermodel.XWPFTableCell; import org.apache.poi.xwpf.usermodel.XWPFTableRow; /* * function:讀取參賽作品登記表中的姓名、學號、聯絡方式、專業、合作者、參選題目、指導老師 * * * 使用這段程式碼需要兩個前提條件: * 1:載入poi-3.10-FINAL資料夾中的jar擴充套件包 * 2:word版本必須在2007以上,格式和樣本一樣 * 這兩步可以看使用手冊 */ public class readFile { private static FileOutputStream out = null ; private static FileInputStream in = null ; private static String filePathDir = "C:\\Users\\wangjunzuo\\Desktop\\ll"; //word檔案存放的資料夾 絕對路徑 public static HSSFWorkbook workbook = null; /* * 進行檔案的第一行便籤寫入,就是excel檔案的第一行:姓名、學號、聯絡方式等等 */ public static void creatLables(String[] labels,String worksheet) throws IOException { out = new FileOutputStream("result.xls"); workbook = new HSSFWorkbook(); HSSFSheet sheet1 = workbook.createSheet(worksheet); HSSFRow rw = workbook.getSheet(worksheet).createRow(0); for(int i=0;i<labels.length;i++) { HSSFCell ce = rw.createCell(i); ce.setCellValue(labels[i]); } workbook.write(out); } /* * 進行資料讀取病寫入檔案中,採用的思路是將一個word檔案中的內容用一個連結串列儲存,連結串列的長度等於表格的格數 * 然後再使用一個連結串列將每個檔案對應的連結串列新增到裡面,可以看成二維陣列形式 * 只要知道我們想要word檔案中的那個單元內容,找到該單元對應的下標進行讀取就行 */ public static void writeToXls(String worksheet) throws IOException { ArrayList<ArrayList<String> > people = new ArrayList() ; FileOutputStream out = new FileOutputStream("result.xls"); //結果輸出檔名 File file = new File(filePathDir); File[] files = file.listFiles(); //獲取資料夾下word檔名列表 for(File a:files) { System.out.println(a.toString()); in = new FileInputStream(a); //依次讀入每一個word檔案 XWPFDocument doc = new XWPFDocument(in); List<XWPFTable> tables = doc.getTables(); for (XWPFTable table : tables) { List<XWPFTableRow> rows = table.getRows(); // 獲取表格的行 ArrayList<String> single = new ArrayList(); //儲存每一表格的所有單元資訊 for (XWPFTableRow row : rows) { List<XWPFTableCell> tableCells = row.getTableCells(); for (XWPFTableCell cell : tableCells) { String text = cell.getText(); single.add(text); }//end for }//end for people.add(single); }//end for } for(int i=0;i<people.size();i++) { /* *這段程式碼用於檢測自己想要單元的下標是否和計算機計算的一樣 * /*for(int j=0;j<people.get(i).size();j++){ System.out.println(people.get(i).get(j)+i+ " "+ j); }*/ HSSFRow rw = workbook.getSheet(worksheet).createRow(i+1); /* * 由表格得知我們想要的資料分別為第1、11、5、9、7、17、13下標的內容 * 下面程式碼建立一行,在該行上建立7個單元格,分別對應姓名、學號等 */ HSSFCell ce = rw.createCell(0); ce.setCellValue(people.get(i).get(1)); ce = rw.createCell(1); ce.setCellValue(people.get(i).get(11)); ce = rw.createCell(2); ce.setCellValue(people.get(i).get(5)); ce = rw.createCell(3); ce.setCellValue(people.get(i).get(9)); ce = rw.createCell(4); ce.setCellValue(people.get(i).get(7)); ce = rw.createCell(5); ce.setCellValue(people.get(i).get(17)); ce = rw.createCell(6); ce.setCellValue(people.get(i).get(13)); } workbook.write(out); } public static void main(String[] args) throws IOException { String[] label= {"姓名","學號","聯絡方式","專業","合作者","參賽題目","指導老師"}; creatLables(label,"資訊彙總"); writeToXls("資訊彙總"); in.close(); out.close(); } }