이전 글에서 Apache Poi 를 활용하여 Excel 양식 복사(Copy Form) 예제를 작성했습니다. 마지막으로 엑셀에 이미지를 넣어주는 예제를 다루려고 합니다. 1. Apache Poi 라이브러리 사용하기 / Excel 표 만들기 예제 2. E...

[안드로이드] Apache Poi 엑셀 이미지 넣기 예제

이전 글에서 Apache Poi 를 활용하여 Excel 양식 복사(Copy Form) 예제를 작성했습니다.

마지막으로 엑셀에 이미지를 넣어주는 예제를 다루려고 합니다.



1. Apache Poi 라이브러리 사용하기 / Excel 표 만들기 예제

2. 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 일부를 따로 작성하여 사용하는 프로젝트를 찾을 수 있었습니다.

github : poi-on-android

 

제가 확인한 정보는 여기까지입니다...

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: