apache poi excel显示 base64 图片_数据处理之带图片Excel数据处理解惑
小編最近項目中遇到一個大批量Excel數據提取的問題,因為Excel數據中含有圖片,所以在程序處理時遇到了困難,小編花了點時間才解決了這個問題,所以在這里mark一下。
1 問題描述
首先來描述一下數據處理的需求,如下圖所以是給定Excel表的數據結構(非項目數據,自己構造),數據包括人的照片、身份證號、生日等信息,數據處理的需求是將Excel中的圖片提取出來并命名為對應身份證號碼保存。
2 python讀取Excel內容
作為一個一個程序員首先想到的就是寫一個腳本來實現自動化提取與重命名,于是想編寫個python腳本來實現。大體設想就是,下載安裝python讀取Excel的包,讀取sheet中的數據行然后將“照片”列不為空的照片保存為該行“身份證”命名的圖片。
用pip安裝xlrd后,用如下代碼進行數據讀入測試:
讀取數據后的輸出如下:
由python打印的輸出結果分析可知,python讀取Excel時將Excel的sheet分別讀入一個dict中,然后通過遍歷dict和dict中的內容來輸出表中內容,本例中只有一個sheet中有數據。但是,python讀取Excel內容只能讀取Excel中的文字,對于Excel列中的圖片xlrd并不能讀取,如上圖所示讀取到的數據每一行的第一列均為空值。
3 java讀取Excel中的內容及圖片
python不能對所描述問題給出完美解決方案,經查閱資料小編準備轉戰java來實現。
首先下載并build如下Excel讀取的POI的jar包:
java讀取Excel中的內容和圖片的代碼如下:
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:
應用java能夠讀取到Excel中的文字與圖片,那么就能利用其相關性進行圖片存儲并重命名。麻煩的問題是,原始數據中存在圖片列為空的行,但是java的POI包只能按順序獲取到圖片并已將圖片為空的行自動去除,那么這樣按照圖片索引找的身份證ID和真正的ID會出現偏差。
為了去除圖片列為空的行,需要對Excel在java讀取時去掉為空的行。但是面對龐大的Excel手動去除成了一大難題,因為插入的圖片是附在Excel單元格上的,所以python在讀取該列時才會都讀為空,java也只能按照圖片在Excel中的位置順序載入圖片。經過試驗,并不能通過查找空值和排序來處理掉Excel中圖片列為空的行。
4 Excel圖片列為空數據預處理
小編經過Excel的多方嘗試,給出下面無圖片行數據刪除的Excel操作。
1.選中相片列---->開始---->條件格式---->突出顯示單元格規則---->重復值---->選擇淺紅色文本填充重復值:
2.在相片列按顏色篩選內容:選中相片列--->開始---->排序和篩選--->篩選--->在相片列按照淺紅色篩選內容。
3.經過篩選后只顯示相片列為空的行,這樣我們只需要刪除了篩選出的行,然后恢復篩選前的條件即可得到刪除相片列為空行的數據結果。
4 總結
綜合2、3兩步得到完整解決開篇描述問題的解決方案:
Excel中刪除相片列為空行的數據---->java讀取圖片和身份證ID---->圖片以ID重命名存
本篇內容在本人個人公眾號上也已發布,歡迎關注本人微信公眾號“勤菜鳥”。
Reference
1.http://www.cnblogs.com/lhj588/archive/2012/01/06/2314181.html
2.https://blog.csdn.net/qw0907/article/details/54617706
總結
以上是生活随笔為你收集整理的apache poi excel显示 base64 图片_数据处理之带图片Excel数据处理解惑的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: django 表单html5,我们如何在
- 下一篇: 微型计算机十号功能,青岛理工大学练习题微