- Arawn's Dev Blog
- Outsider's Dev Story
- Toby's Epril
- Benelog
- NHN 개발자 블로그
- SK 플래닛 기술 블로그
- OLC CENTER
- 소프트웨어 경영/공학 블로그
- 모바일 컨버전스
- KOSR - Korea Operating System …
- 넥스트리 블로그
- 리버스코어 ReverseCore
- SLiPP
- 개발자를 위하여... (Nextree 임병인 수석)
- "트위터 부트스트랩: 디자이너도 놀라워할 매끈하고 직관…
- Learning English - The English…
- real-english.com
- 'DataScience/Deep Learning' 카테…
- Deep Learning Summer School, M…
- Deep Learning Courses
민서네집
Excel (xls포맷) Form Control (Checkbox) 상태 읽기. 본문
TeamDev 의 jExcel 라이브러리를 이용하는 방법 (상용)
Reading Check Boxes. |
https://groups.google.com/a/teamdev.com/forum/#!topic/jexcel-forum/-HGKvLio91c
여기에 Test.xlsx 파일과 CheckboxSample.java 파일을 다운로드 받을 수 있는데,
컴파일 하기 위해서는 http://www.teamdev.com/ 에서 배포하는 라이브러가 필요하다.
위 홈페이지에서 jExcel 이라는 라이브러리와 의존성이 있는 라이브러리가 필요한데,
http://www.teamdev.com/jexcel 들어가서 다운로드 받아서 압축을 풀어서 lib 디렉터리에 있는 jar 파일을 모두 classpath에 추가하면 된다.
http://www.teamdev.com/jniwrapper 에서 jniwrap.dll (jniwrap64.dll) 파일도 다운로드 받아야 한다.
다운로드 받아서 PATH 로 지정된 디렉터리 안에 집어 넣어야 된다.
이렇게 다 다운로드 받아서 돌리니...
Exception in thread "main" java.lang.ExceptionInInitializerError
at com.jniwrapper.win32.jexcel.Application.<clinit>(Unknown Source)
at CheckboxSample.main(CheckboxSample.java:33)
Caused by: java.lang.RuntimeException: JNIWrapper license check failed: No valid license found.
허무하게도 이런 에러가...
jExcel의 경우 개발자 1명 당 $799 이다.
JNIWrapper의 경우 개발자 1명 당 $499 이다.
이 라이브러리들은 http://mvnrepository.com 에도 없음.
JExcelApi 를 이용하는 방법 - 모름.
Get value of unmapped checkbox in excel using JExcelApi
/* ==================================================================== Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ package org.apache.poi.hssf.usermodel; import org.apache.poi.ddf.*; import org.apache.poi.hssf.model.DrawingManager2; import org.apache.poi.hssf.model.InternalSheet; import org.apache.poi.hssf.model.InternalWorkbook; import org.apache.poi.hssf.record.EscherAggregate; import org.apache.poi.hssf.record.ObjRecord; import org.apache.poi.hssf.record.TextObjectRecord; /** * Helper class for HSSF tests that aren't within the * HSSF UserModel package, but need to do internal * UserModel things. */ public class HSSFTestHelper { public static class MockDrawingManager extends DrawingManager2 { public MockDrawingManager (){ super(null); } @Override public int allocateShapeId(short drawingGroupId) { return 1025; //Mock value } @Override public int allocateShapeId(short drawingGroupId, EscherDgRecord dg) { return 1025; } public EscherDgRecord createDgRecord() { EscherDgRecord dg = new EscherDgRecord(); dg.setRecordId( EscherDgRecord.RECORD_ID ); dg.setOptions( (short) (16) ); dg.setNumShapes( 1 ); dg.setLastMSOSPID( 1024 ); return dg; } } /** * Lets non UserModel tests at the low level Workbook */ public static InternalWorkbook getWorkbookForTest(HSSFWorkbook wb) { return wb.getWorkbook(); } public static InternalSheet getSheetForTest(HSSFSheet sheet) { return sheet.getSheet(); } public static HSSFPatriarch createTestPatriarch(HSSFSheet sheet, EscherAggregate agg){ return new HSSFPatriarch(sheet, agg); } public static EscherAggregate getEscherAggregate(HSSFPatriarch patriarch){ return patriarch._getBoundAggregate(); } public static int allocateNewShapeId(HSSFPatriarch patriarch){ return patriarch.newShapeId(); } public static EscherOptRecord getOptRecord(HSSFShape shape){ return shape.getOptRecord(); } public static void setShapeId(HSSFShape shape, int id){ shape.setShapeId(id); } public static EscherContainerRecord getEscherContainer(HSSFShape shape){ return shape.getEscherContainer(); } public static TextObjectRecord getTextObjRecord(HSSFSimpleShape shape){ return shape.getTextObjectRecord(); } public static ObjRecord getObjRecord(HSSFShape shape){ return shape.getObjRecord(); } public static EscherRecord getEscherAnchor(HSSFAnchor anchor){ return anchor.getEscherAnchor(); } }
package com.example.excel.service; import java.lang.reflect.Field; import java.util.HashMap; import java.util.Iterator; import java.util.List; import org.apache.poi.hssf.model.InternalSheet; import org.apache.poi.hssf.record.CommonObjectDataSubRecord; import org.apache.poi.hssf.record.EndSubRecord; import org.apache.poi.hssf.record.ObjRecord; import org.apache.poi.hssf.record.RecordBase; import org.apache.poi.hssf.record.SubRecord; import org.apache.poi.hssf.record.TextObjectRecord; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFTestHelper; import org.springframework.stereotype.Service; @Service public class ExcelService { public void findCellCheckbox(HSSFSheet hssfSheet) { HashMap<String,Boolean> checkBoxMap = new HashMap<String,Boolean>(); InternalSheet isheet = HSSFTestHelper.getSheetForTest(hssfSheet); for (Iterator<RecordBase> it=isheet.getRecords().iterator(); it.hasNext(); ) { RecordBase rec = it.next(); if (rec instanceof ObjRecord) { ObjRecord objRec = (ObjRecord)rec; List<SubRecord> subRecords = objRec.getSubRecords(); // CheckBox의 Label 이름 String checkBoxLabel = ""; for(SubRecord sub : subRecords) { if (sub instanceof CommonObjectDataSubRecord) { CommonObjectDataSubRecord cmo = (CommonObjectDataSubRecord)sub; // CheckBox의 Label 이름 읽기. if (cmo.getObjectType() == CommonObjectDataSubRecord.OBJECT_TYPE_CHECKBOX ) { while (it.hasNext()) { rec = (RecordBase)it.next(); if (rec instanceof TextObjectRecord) { checkBoxLabel = ((TextObjectRecord) rec).getStr().toString(); break; } } } // EDIT Box 안의 Text 읽기. if( cmo.getObjectType() == CommonObjectDataSubRecord.OBJECT_TYPE_TEXT ) { while (it.hasNext()) { rec = (RecordBase)it.next(); if (rec instanceof TextObjectRecord) { String text = ((TextObjectRecord) rec).getStr().toString(); System.out.println("Text: " + text); break; } } } } else if ( !(sub instanceof EndSubRecord) ) { //System.out.println("sub: " + sub); // sub: org.apache.poi.hssf.record.SubRecord$UnknownSubRecord [sid=0x0012 size=8 : [01, 00, 00, 00, 00, 00, 03, 00]] // 위 문자열에서 01 은 checked 상태, 00 은 not checked 상태, 02 는 gray(mixed) 상태이다. // CheckBox의 status를 가지고 있는 것은 org.apache.poi.hssf.record.UnknownSubRecord Type인데, // UnknownSubRecord Class는 private Class 라서 reflection 으로 private 멤버 변수의 값을 가져왔다. try { Class<?> clazz = Class.forName("org.apache.poi.hssf.record.SubRecord$UnknownSubRecord"); Field sidField = clazz.getDeclaredField("_sid"); // 다음 에러를 방지하기 위해 isInstance() 로 체크해준다. // java.lang.IllegalArgumentException: Can not set final int field org.apache.poi.hssf.record.SubRecord$UnknownSubRecord._sid to org.apache.poi.hssf.record.GroupMarkerSubRecord if( clazz.isInstance(sub) ) { sidField.setAccessible(true); int _sid = (int) sidField.get(sub); if( _sid == 10 ) { Field dataField = clazz.getDeclaredField("_data"); dataField.setAccessible(true); byte[] _data = (byte[]) dataField.get(sub); int status = _data[0]; // CheckBox의 check 상태 조회 if( status == 1 ) { checkBoxMap.put(checkBoxLabel, true); // checked } else { checkBoxMap.put(checkBoxLabel, false); // not checked } } } } catch (ClassNotFoundException | NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { e.printStackTrace(); } } } } } System.out.println("CheckBoxMap: " + checkBoxMap); } }
Check Box가 있는 샘플 xls 파일
'Java' 카테고리의 다른 글
[Apache POI] 날짜 서식의 셀 데이터 읽기 (0) | 2015.05.07 |
---|---|
[Apache POI] xlsx 파일을 xls 파일로 변환하는 메서드 (0) | 2015.04.29 |
MyBatis를 이용해서 이미지 파일을 DB에 저장하고 불러오기 (0) | 2015.04.20 |
[java] 리소스 파일 절대경로 가져오기. (1) | 2015.04.17 |
[Apache POI 라이브러리] 병합된 cell 인지 확인하는 코드 (0) | 2015.04.10 |