亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

java使用Apache POI操作excel文件

2019-11-14 21:00:53
字體:
來源:轉載
供稿:網友
java使用Apache POI操作Excel文件
  • 官方介紹
HSSF is the POI xml (.xlsx) file format.從官方文檔中了解到:POI提供的HSSF包用于操作Excel '97(-2007)的.xls文件,而XSSF包則用于操作Excel2007之后的.xslx文件。
  • 需要的jar包
POI官網上下載包并解壓獲取java操作excel文件必須的jar包:其中dom4j-1.6.1.jar和xbean.jar(下載地址:http://mirror.bjtu.edu.cn/apache/xmlbeans/binaries/ 網站:http://xmlbeans.apache.org)并不包含在POI提供的jar包中,需要單獨下載,否則程序會拋出異常:java.lang.ClassNotFoundException:org.apache.xmlbeans.XmlOptions。
  • 具體代碼
在Eclipse中創建一個java project,將上面列出來的jar包都加入到工程的classpath中,否則引用不到jar包會報錯。直接上代碼(代碼基本框架來自Apache POI官方網站,自行調整部分):創建excel文件并寫入內容:
public static void createWorkbook() throws IOException {        Workbook wb = new HSSFWorkbook();        String safeName1 = WorkbookUtil.createSafeSheetName("[O'sheet1]");        Sheet sheet1 = wb.createSheet(safeName1);        CreationHelper createHelper = wb.getCreationHelper();        // Create a row and put some cells in it. Rows are 0 based.        Row row = sheet1.createRow((short) 0);        // Create a cell and put a value in it.        Cell cell = row.createCell(0);        cell.setCellValue(1234);        // Or do it on one line.        row.createCell(2).setCellValue(                createHelper.createRichTextString("This is a string"));        row.createCell(3).setCellValue(true);        // we style the second cell as a date (and time). It is important to        // create a new cell style from the workbook otherwise you can end up        // modifying the built in style and effecting not only this cell but        // other cells.        CellStyle cellStyle = wb.createCellStyle();        cellStyle.setDataFormat(createHelper.createDataFormat().getFormat(                "m/d/yy h:mm"));        cell = row.createCell(1);        cell.setCellValue(new Date());        cell.setCellStyle(cellStyle);        // you can also set date as java.util.Calendar        CellStyle cellStyle1 = wb.createCellStyle();        cellStyle1.setDataFormat(createHelper.createDataFormat().getFormat(                "yyyyMMdd HH:mm:ss"));        cellStyle1.setBorderBottom(CellStyle.BORDER_THIN);        cellStyle1.setBottomBorderColor(IndexedColors.BLACK.getIndex());        cellStyle1.setBorderLeft(CellStyle.BORDER_THIN);        cellStyle1.setLeftBorderColor(IndexedColors.GREEN.getIndex());        cellStyle1.setBorderRight(CellStyle.BORDER_THIN);        cellStyle1.setRightBorderColor(IndexedColors.BLUE.getIndex());        cellStyle1.setBorderTop(CellStyle.BORDER_MEDIUM_DASHED);        cellStyle1.setTopBorderColor(IndexedColors.BLACK.getIndex());        cell = row.createCell(4);        cell.setCellValue(Calendar.getInstance());        cell.setCellStyle(cellStyle1);        FileOutputStream fileOut = new FileOutputStream("e:/test/workbook.xls");        wb.write(fileOut);        fileOut.close();    }

讀取excel文件的內容:

public static void readExcel() throws InvalidFormatException, IOException {        // Use a file        Workbook wb1 = WorkbookFactory.create(new File("e:/test/userinfo.xls"));        Sheet sheet = wb1.getSheetAt(0);        // Decide which rows to process        // int rowStart = Math.min(10, sheet.getFirstRowNum());        // int rowEnd = Math.max(40, sheet.getLastRowNum());        int rowStart = sheet.getLastRowNum();        int rowEnd = sheet.getLastRowNum() + 1;        logger.info(sheet.getFirstRowNum());        logger.info(sheet.getLastRowNum());        for (int rowNum = rowStart; rowNum < rowEnd; rowNum++) {            Row r = sheet.getRow(rowNum);            int lastColumn = Math.max(r.getLastCellNum(), 10);            logger.info(lastColumn);            // To get the contents of a cell, you first need to know what kind            // of cell it is (asking a string cell for its numeric contents will            // get you a NumberFormatException for example). So, you will want            // to switch on the cell's type, and then call the appropriate            // getter for that cell.            for (int cn = 0; cn < lastColumn; cn++) {                // Cell cell = r.getCell(cn, Row.RETURN_BLANK_AS_NULL);                Cell cell = r.getCell(cn);                switch (cell.getCellType()) {                case Cell.CELL_TYPE_STRING:                    logger.info(cell.getRichStringCellValue().getString());                    break;                case Cell.CELL_TYPE_NUMERIC:                    if (DateUtil.isCellDateFormatted(cell)) {                        logger.info(cell.getDateCellValue());                    } else {                        logger.info(cell.getNumericCellValue());                    }                    break;                case Cell.CELL_TYPE_BOOLEAN:                    logger.info(cell.getBooleanCellValue());                    break;                case Cell.CELL_TYPE_FORMULA:                    logger.info(cell.getCellFormula());                    break;                default:                    logger.info("empty");                }            }        }    }

下面給出一個具體的例子,實例中的excel文件內容如下:

我們的程序要做的事情是:根據第一行標題的順序來讀取每一行文件的內容,實際標題和內容的順序是不確定的,但是我們要求按照給定的順序輸出文件內容。代碼如下:
public static void readUserInfo() throws InvalidFormatException,            IOException {        String[] titles = { "收費編號", "收費性質", "姓名", "家庭住址", "工作單位", "電話", "手機",                "小區樓號", "單元號", "樓層", "房間號", "建筑面積(㎡)", "面積依據", "A面積", "A超",                "A輕體", "B面積", "B超", "B輕體", "用戶編號", "所屬樓前表表號" };                //用來存儲標題和順序的map,key為標題,value為順序號        Map<String, Integer> titleMap = new HashMap<String, Integer>();        //將既定順序寫入map        for (int i=0 ; i<titles.length; i++) {            titleMap.put(titles[i], i);        }        Workbook wb = WorkbookFactory.create(new File("e:/test/userinfo.xls"));        for (int numSheet = 0; numSheet < wb.getNumberOfSheets(); numSheet++) {            Sheet xSheet = wb.getSheetAt(numSheet);            if (xSheet == null) {                continue;            }            // 獲取第一行的標題內容            Row tRow = xSheet.getRow(0);            //存儲標題順序的數組            Integer[] titleSort = new Integer[tRow.getLastCellNum()];                        //循環標題            for (int titleNum = 0; titleNum < tRow.getLastCellNum(); titleNum++) {                Cell tCell = tRow.getCell(titleNum);                String title = "";                if (tCell == null || "".equals(tCell)) {                } else if (tCell.getCellType() == XSSFCell.CELL_TYPE_BOOLEAN) {// 布爾類型處理                    // logger.info(xCell.getBooleanCellValue());                } else if (tCell.getCellType() == XSSFCell.CELL_TYPE_NUMERIC) {// 數值類型處理                    title = doubleToString(tCell.getNumericCellValue());                } else {// 其他類型處理                    title = tCell.getStringCellValue();                }                //通過獲取的標題,從map中讀取順訊號,寫入保存標題順序號的數組                Integer ts = titleMap.get(title);                if (ts != null) {                    titleSort[titleNum] = ts;                }            }            // 循環行Row            for (int rowNum = 1; rowNum < xSheet.getLastRowNum() + 1; rowNum++) {                Row xRow = xSheet.getRow(rowNum);                if (xRow == null) {                    continue;                }                // 循環列Cell                String[] v = new String[titleSort.length];                for (int cellNum = 0; cellNum < titleSort.length; cellNum++) {                    Cell xCell = xRow.getCell(cellNum);                    String value = "";                    if (xCell == null || "".equals(xCell)) {                    } else if (xCell.getCellType() == XSSFCell.CELL_TYPE_BOOLEAN) {// 布爾類型處理                     logger.info(xCell.getBooleanCellValue());                    } else if (xCell.getCellType() == XSSFCell.CELL_TYPE_NUMERIC) {// 數值類型處理                        value = doubleToString(xCell.getNumericCellValue());                    } else {// 其他類型處理                        value = xCell.getStringCellValue();                    }                                        //按照標題順序的編號來存儲每一行記錄                    v[titleSort[cellNum]] = value;//                    logger.info("v[" + titleSort[cellNum] + "] = " + v[titleSort[cellNum]]);                }                //循環結果數組,獲取的與既定順序相同                for (int i = 0; i < v.length; i++) {                    logger.info(v[i]);                }            }        }    }

上段程序中用到的工具類doubleToString(將excel中的double類型轉為String類型,處理了科學計數法形式的數):

private static String doubleToString(double d) {        String str = Double.valueOf(d).toString();        // System.out.println(str);        String result = "";        if (str.indexOf("E") > 2) {            int index = str.indexOf("E");            int power = Integer.parseInt(str.substring(index + 1));            BigDecimal value = new BigDecimal(str.substring(0, index));            value = value.movePointRight(power);            result = value.toString();        } else {            if (str.indexOf(".0") > 0)                result = str.substring(0, str.indexOf(".0"));            else                result = str;        }        return result;    }

目前對于POI的應用只限于此,并沒有再深入,以后寫了新的相關內容會繼續補充,請大大們批評指正!

轉載請注明出處:http://www.49028c.com/bxljoy/p/3939409.html


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲成人亚洲激情| 国产欧美日韩精品专区| 精品动漫一区二区| 日本19禁啪啪免费观看www| 精品国产一区二区三区久久狼5月| 精品视频在线播放色网色视频| 91性高湖久久久久久久久_久久99| 在线播放日韩欧美| 久久久久久这里只有精品| 成人激情视频在线| 欧美中文字幕在线播放| 欧美在线精品免播放器视频| 国产亚洲一区二区在线| 欧美在线观看一区二区三区| 国产精品高精视频免费| 亚洲国产精品久久久久| 欧美午夜性色大片在线观看| 日本19禁啪啪免费观看www| 成人免费网站在线看| 成人午夜两性视频| 亚洲视频axxx| 亚洲午夜未满十八勿入免费观看全集| 国产欧美日韩精品在线观看| 欧美激情精品久久久久久久变态| 91精品国产综合久久男男| 国产精自产拍久久久久久| 欧美猛交ⅹxxx乱大交视频| 欧美理论在线观看| 国产日韩精品综合网站| 欧美午夜女人视频在线| 国产成人精品免高潮在线观看| 日韩精品欧美激情| 国产精品日韩欧美大师| 欧美黑人xxx| 97精品久久久| 亚洲精品视频在线观看视频| 69av成年福利视频| 中文字幕亚洲色图| 日韩在线视频导航| 久久精品视频一| 91精品国产91久久久久久久久| 久久国产精品影片| 国产精品永久免费在线| 亚洲福利视频久久| 亚洲永久在线观看| 91色琪琪电影亚洲精品久久| 亚洲欧美日韩精品久久| 亚洲午夜未满十八勿入免费观看全集| 日韩欧美中文字幕在线观看| 日韩高清av一区二区三区| 成人在线视频福利| 国产伦精品一区二区三区精品视频| 美女视频黄免费的亚洲男人天堂| 亚洲天堂男人天堂女人天堂| 日韩精品在线观看一区| 国产日韩欧美综合| 国产精品手机播放| 96国产粉嫩美女| 亚洲偷熟乱区亚洲香蕉av| 欧美大片大片在线播放| 久久亚洲精品小早川怜子66| 欧美综合一区第一页| 欧美日韩一区二区免费在线观看| 成人高清视频观看www| 成人h猎奇视频网站| 亚洲欧洲日产国码av系列天堂| 成人精品视频久久久久| 欧美日韩一区二区在线| 亚洲视频日韩精品| 亚洲第一精品福利| 久久免费福利视频| 最近2019中文字幕第三页视频| 欧美精品videosex极品1| 欧美午夜精品久久久久久人妖| 国产精品成人免费电影| 久久久久久欧美| 日韩一区视频在线| 日韩av在线资源| 亚洲视频一区二区三区| 色偷偷av亚洲男人的天堂| 在线视频国产日韩| 国产福利精品视频| 国产精品极品美女粉嫩高清在线| 国产亚洲精品久久| 亚洲成av人乱码色午夜| 色琪琪综合男人的天堂aⅴ视频| 自拍偷拍亚洲精品| 91av免费观看91av精品在线| 欧美人与性动交a欧美精品| 九九热r在线视频精品| 91精品久久久久久久久| 中文字幕最新精品| 成人精品视频在线| 中文字幕亚洲天堂| 亚洲高清色综合| 最近2019年手机中文字幕| 欧美中文字幕视频在线观看| 欧美精品手机在线| 自拍偷拍亚洲一区| 欧美日韩国产综合新一区| 欧美电影在线观看高清| 午夜精品久久久99热福利| 国产精品情侣自拍| 亚洲人成网站999久久久综合| 中文字幕av一区| 欧美高清videos高潮hd| 久久精品亚洲一区| 久久99精品视频一区97| 亚洲一区二区少妇| 亚洲2020天天堂在线观看| 日本欧美黄网站| 亚洲一级黄色av| 国产精品视频永久免费播放| 一区二区三区天堂av| 欧美日韩不卡合集视频| 久久久久久亚洲精品| 欧美大肥婆大肥bbbbb| 欧美日韩一区二区在线| 一区二区三区久久精品| 日本韩国欧美精品大片卡二| 欧美成人激情图片网| 91色精品视频在线| 成人激情在线播放| 日韩精品视频免费在线观看| 91夜夜揉人人捏人人添红杏| 97在线视频国产| 精品久久久久久亚洲国产300| 国产一区玩具在线观看| 国产伦精品一区二区三区精品视频| 伊人激情综合网| 亚洲成人亚洲激情| 国产一区二区精品丝袜| 久久99精品久久久久久琪琪| 久久国产精品久久国产精品| 精品呦交小u女在线| 亚洲国产天堂网精品网站| 国产视频一区在线| 国产欧美一区二区三区视频| 亚洲国产精品成人va在线观看| 97免费在线视频| 成人欧美在线视频| 在线播放国产一区二区三区| 久久精品电影网| 亚洲天堂男人天堂女人天堂| 麻豆国产精品va在线观看不卡| 久久久久久久一区二区| 国产精品久久久久久久久久久不卡| 亚洲成**性毛茸茸| 欧洲精品在线视频| 免费97视频在线精品国自产拍| 九九精品在线视频| 欧美日韩亚洲一区二区三区| 热99精品只有里视频精品| 日韩视频免费看| 国产精品高潮呻吟久久av野狼| 亚洲欧美国产视频| 国产成人综合精品在线| 青草热久免费精品视频| 日韩精品视频三区| 2019精品视频| 大量国产精品视频| 欧美xxxx18性欧美| 欧美激情亚洲综合一区| 91a在线视频|