apache poi excel显示 base64 图片_数据处理之带图片Excel数据处理解惑
小編最近項目中遇到一個大批量Excel數(shù)據(jù)提取的問題,因為Excel數(shù)據(jù)中含有圖片,所以在程序處理時遇到了困難,小編花了點時間才解決了這個問題,所以在這里mark一下。
1 問題描述
首先來描述一下數(shù)據(jù)處理的需求,如下圖所以是給定Excel表的數(shù)據(jù)結(jié)構(gòu)(非項目數(shù)據(jù),自己構(gòu)造),數(shù)據(jù)包括人的照片、身份證號、生日等信息,數(shù)據(jù)處理的需求是將Excel中的圖片提取出來并命名為對應(yīng)身份證號碼保存。
2 python讀取Excel內(nèi)容
作為一個一個程序員首先想到的就是寫一個腳本來實現(xiàn)自動化提取與重命名,于是想編寫個python腳本來實現(xiàn)。大體設(shè)想就是,下載安裝python讀取Excel的包,讀取sheet中的數(shù)據(jù)行然后將“照片”列不為空的照片保存為該行“身份證”命名的圖片。
用pip安裝xlrd后,用如下代碼進行數(shù)據(jù)讀入測試:
讀取數(shù)據(jù)后的輸出如下:
由python打印的輸出結(jié)果分析可知,python讀取Excel時將Excel的sheet分別讀入一個dict中,然后通過遍歷dict和dict中的內(nèi)容來輸出表中內(nèi)容,本例中只有一個sheet中有數(shù)據(jù)。但是,python讀取Excel內(nèi)容只能讀取Excel中的文字,對于Excel列中的圖片xlrd并不能讀取,如上圖所示讀取到的數(shù)據(jù)每一行的第一列均為空值。
3 java讀取Excel中的內(nèi)容及圖片
python不能對所描述問題給出完美解決方案,經(jīng)查閱資料小編準(zhǔn)備轉(zhuǎn)戰(zhàn)java來實現(xiàn)。
首先下載并build如下Excel讀取的POI的jar包:
java讀取Excel中的內(nèi)容和圖片的代碼如下:
package test; import java.io.File; import java.io.FileInputStream; import java.util.List;import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.DateUtil; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.xssf.usermodel.XSSFPictureData; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public final class TestImportXlsx {public static void main(String[] args) throws Exception {File excelFile = new File("/root/zachary/extract_img/data.xlsx");XSSFWorkbook wb = new XSSFWorkbook(new FileInputStream(excelFile));XSSFSheet sheet = wb.getSheetAt(0);for (Row row : sheet) {for (Cell cell : row) {switch (cell.getCellType()) {case Cell.CELL_TYPE_STRING:System.out.print(cell.getRichStringCellValue().getString());System.out.print("|");break;case Cell.CELL_TYPE_NUMERIC:if (DateUtil.isCellDateFormatted(cell)) {System.out.print(String.valueOf(cell.getDateCellValue()));} else {System.out.print(cell.getNumericCellValue());}System.out.print("|");break;case Cell.CELL_TYPE_BOOLEAN:System.out.print(cell.getBooleanCellValue());System.out.print("|");break;default:}}System.out.println();} //讀取圖片List<XSSFPictureData> pictures = wb.getAllPictures(); for (int i = 0; i < pictures.size(); i++) {XSSFPictureData pictureData = pictures.get(i);byte[] picData = pictureData.getData();System.out.println("image-size:" + picData.length);} System.out.println(wb.getSheetName(0));} }troubleshoot:
應(yīng)用java能夠讀取到Excel中的文字與圖片,那么就能利用其相關(guān)性進行圖片存儲并重命名。麻煩的問題是,原始數(shù)據(jù)中存在圖片列為空的行,但是java的POI包只能按順序獲取到圖片并已將圖片為空的行自動去除,那么這樣按照圖片索引找的身份證ID和真正的ID會出現(xiàn)偏差。
為了去除圖片列為空的行,需要對Excel在java讀取時去掉為空的行。但是面對龐大的Excel手動去除成了一大難題,因為插入的圖片是附在Excel單元格上的,所以python在讀取該列時才會都讀為空,java也只能按照圖片在Excel中的位置順序載入圖片。經(jīng)過試驗,并不能通過查找空值和排序來處理掉Excel中圖片列為空的行。
4 Excel圖片列為空數(shù)據(jù)預(yù)處理
小編經(jīng)過Excel的多方嘗試,給出下面無圖片行數(shù)據(jù)刪除的Excel操作。
1.選中相片列---->開始---->條件格式---->突出顯示單元格規(guī)則---->重復(fù)值---->選擇淺紅色文本填充重復(fù)值:
2.在相片列按顏色篩選內(nèi)容:選中相片列--->開始---->排序和篩選--->篩選--->在相片列按照淺紅色篩選內(nèi)容。
3.經(jīng)過篩選后只顯示相片列為空的行,這樣我們只需要刪除了篩選出的行,然后恢復(fù)篩選前的條件即可得到刪除相片列為空行的數(shù)據(jù)結(jié)果。
4 總結(jié)
綜合2、3兩步得到完整解決開篇描述問題的解決方案:
Excel中刪除相片列為空行的數(shù)據(jù)---->java讀取圖片和身份證ID---->圖片以ID重命名存
本篇內(nèi)容在本人個人公眾號上也已發(fā)布,歡迎關(guān)注本人微信公眾號“勤菜鳥”。
Reference
1.http://www.cnblogs.com/lhj588/archive/2012/01/06/2314181.html
2.https://blog.csdn.net/qw0907/article/details/54617706
總結(jié)
以上是生活随笔為你收集整理的apache poi excel显示 base64 图片_数据处理之带图片Excel数据处理解惑的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: django 表单html5,我们如何在
- 下一篇: 微型计算机十号功能,青岛理工大学练习题微