用Java讀取excel文件並改寫內容


工作時遇到這種情況:產品臨時給一個表,表有六個sheet頁,對應六個表,都是關於一些學生的信息啊,我們要用到這些數據,那么必須自己倒騰,把這些數據插到數據庫,還好現在一些連接數據庫的客戶端便捷,我們可以直接導入excel,我用的Navicat Premium,將表導入成功,中間出了一些版本問題,貌似只能讀取97-03  xls格式的Excel,總之注意文檔的版本。因為給的表的字段名都是中文,一般咱們字段名用英文,所以就要改一下,最方便的估計就是寫個工具將中文名字改成對應的首位字母拼起來的名字,如博客園變成bky。於是便有了如下代碼:

package com.iflytek.excel;

import java.io.File;    
import java.io.FileInputStream;
import java.io.IOException;  
import java.io.InputStream;
import org.junit.Test;
import net.sourceforge.pinyin4j.PinyinHelper; 
import jxl.Workbook;  
import jxl.read.biff.BiffException;  
import jxl.write.WritableCell;
import jxl.write.WritableSheet;
import jxl.write.WriteException;

    public class ReadExcel {
        
        @Test
        public  void operate() throws BiffException, IOException {
            ReadExcel obj = new ReadExcel(); 
            //創建Excel路徑
            File file = new File("C:"+ File.separator +"Users"+ File.separator +"Administrator"+
                          File.separator +"Desktop"+ File.separator +"學生報告樣本數據@0421.xls");
            obj.readExcel(file);
        }
            
        // 讀Excel的方法readExcel,該方法的參數為一個File對象
        public void readExcel(File file) throws BiffException, IOException {
            try {
                jxl.Workbook wb =null;                                 //創建一個workbook對象
                String excelpath = file.getAbsolutePath();
                
                InputStream is = new FileInputStream(excelpath);      //創建一個文件流,讀入Excel文件
                wb = Workbook.getWorkbook(is);                        //將文件流寫入到workbook對象
                                
                //jxl.Workbook 對象是只讀的,所以如果要修改Excel,需要創建一個可讀的副本,副本指向原Excel文件
                jxl.write.WritableWorkbook wbe= Workbook.createWorkbook(new File(excelpath), wb);//創建workbook的副本
                int sheet_size=wbe.getNumberOfSheets();
                
                
                for (int index = 0; index < sheet_size; index++) {
                    // 每個頁簽創建一個Sheet對象
                    WritableSheet sheet  = wbe.getSheet(index);        //獲取sheet
                    // sheet.getColumns()返回該頁的總列數
                    int column_total = sheet.getColumns();
                    for (int j = 0; j < column_total; j++) {
                        String cellinfo = sheet.getCell(j, 0).getContents();
                        WritableCell cell =sheet.getWritableCell(j, 0); //獲取第一行的所有單元格
                        jxl.format.CellFormat cf = cell.getCellFormat();//獲取第一個單元格的格式
                        jxl.write.Label lbl = new jxl.write.Label(j, 0, getPinYinHeadChar(cellinfo));//修改後的值
                        lbl.setCellFormat(cf);                          //將修改后的單元格的格式設定成跟原來一樣
                        sheet.addCell(lbl);                             //將改過的單元格保存到sheet
                    }
                }
                wbe.write();                                            //將修改保存到workbook
                wbe.close();                                            //關閉workbook,釋放內存 
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (WriteException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

         
        // 返回中文的首字母  
         public static String getPinYinHeadChar(String str) {  
            String convert = "";  
            for (int j = 0; j < str.length(); j++) {  
               char word = str.charAt(j);  
                String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(word);  
                if (pinyinArray != null) {  
                    convert += pinyinArray[0].charAt(0);  
               } else {  
                     convert += word;  
                }  
            }  
            System.out.println(convert);
            return convert;              
         }  

}


第一次使用Jxl,通過它,Java可以很方便的操作微軟的Excel文檔。除了Jxl之外,還有Apache的一個POI項目,也可以操作Excel。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM