이전 글에서 Apache Poi 를 활용하여 Excel 양식 복사(Copy Form) 예제를 작성했습니다.
마지막으로 엑셀에 이미지를 넣어주는 예제를 다루려고 합니다.
1. Apache Poi 라이브러리 사용하기 / Excel 표 만들기 예제
3. Excel 이미지 넣기 예제 (현재 글)
1. 이미지 넣기
Excel sheet에 이미지를 넣기 위해 setCellImage 메서드를 작성하였습니다.
주요 내용은 아래와 같습니다.
- Image Data (Byte Array) : 이미지 데이터
- Picture ID : addPicture 를 통해 이미지를 등록하면 고유의 아이디 할당
- ClientAnchor : 이미지를 배치하기 위해 사용
- Picture : createPicture 를 통해 sheet에 이미지 첨부
fun setCellImage(sheet: Sheet, rowStartIndex: Int, rowEndIndex: Int, columnStartIndex: Int, columnEndIndex: Int, bitmap: Bitmap) {
// Convert bitmap to byte array
val stream = ByteArrayOutputStream()
bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream)
val imageData = stream.toByteArray()
// Add picture to the workbook. (Picture is assigned unique ID)
val pictureID = xssfWorkbook.addPicture(imageData, Workbook.PICTURE_TYPE_PNG)
// Use 'ClientAnchor' to position on sheet.
val helper = sheet.workbook.creationHelper
val anchor = helper.createClientAnchor()
anchor.row1 = rowStartIndex
anchor.row2 = rowEndIndex
anchor.setCol1(columnStartIndex)
anchor.setCol2(columnEndIndex)
// Attach picture to the sheet.
val drawing = sheet.createDrawingPatriarch() as XSSFDrawing
val picture = drawing.createPicture(anchor, pictureID)
// java.lang.NoClassDefFoundError: Failed resolution of: java/awt/Dimension
// picture.resize()
}
------------------------------------------------------------------------------------------------------------
(여기서 잠깐 참고 내용입니다..!)
이미지 넣는 메서드는 보시다시피 Row/Column 단위로 사이즈를 정해주고 있습니다.
개인적으로 세부적인 사이즈를 조정하려고 picture.resize() 를 사용하고싶었는데요,
아래와 같이 Exception이 발생하더라구요...ㅠㅠ
"java.lang.NoClassDefFoundError: Failed resolution of: Ljava/awt/Dimension"
제가 확인한바로는 Android 에서는 java.awt 패키지 클래스들을 제공하지 않기 때문에
Exception이 발생하는거라고 합니다.
(그럼 사용하지 못하는걸까..?)
비슷한 사례로 java.awt.Color 일부를 따로 작성하여 사용하는 프로젝트를 찾을 수 있었습니다.
제가 확인한 정보는 여기까지입니다...
resize 한번 해보겠다고 시간을 꽤 써봤지만
결국 해결하지는 못 했습니다.
혹시 방법을 알고 계신 분이 있다면 꼭 댓글 부탁 드립니다!
------------------------------------------------------------------------------------------------------------
본론으로 돌아와서..
준비된 setCellImage 메서드를 사용해서 적당히 귀여운 이미지로 테스트를 해봅니다.
class ExcelImageEx : ExcelBase() {
companion object {
const val ASSET_IMAGE_CAT = "cat.jpg"
const val ASSET_IMAGE_DOG = "dog.jpg"
}
override fun create(): Workbook {
xssfWorkbook = XSSFWorkbook()
val sheetA = xssfWorkbook.createSheet()
addContent(sheetA)
return xssfWorkbook
}
private fun addContent(sheet: Sheet) {
setCellImage(sheet, 1, 12, 1, 8, getBitmapFromAssets(ASSET_IMAGE_CAT))
setCellImage(sheet, 14, 30, 1, 12, getBitmapFromAssets(ASSET_IMAGE_DOG))
}
private fun getBitmapFromAssets(name: String): Bitmap {
val inputStream = MainApplication.getContext().assets.open(name)
return BitmapFactory.decodeStream(inputStream)
}
}
3. 실행 결과
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
binding.btnImageEx.setOnClickListener {
val imageEx = ExcelImageEx()
val workBook = imageEx.create()
imageEx.saveExcel(workBook, "/sdcard/Download/imageEx.xlsx")
}
}
}
4. 예제 다운로드
https://github.com/bictoselfdev/ExcelEx
0 comments: