java导出excel带图片_JAVA的poi实现模版导出excel(带图片).doc
时间: 2023-11-06 18:06:24 浏览: 241
Java中使用POI库可以实现Excel文件的操作,包括读取、写入、修改等。下面是使用POI库实现带图片的模板导出Excel的示例代码:
1. 导入依赖库
在pom.xml文件中添加以下依赖:
```
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>3.17</version>
</dependency>
```
2. 创建Excel模板
创建一个Excel模板,包含需要导出的数据和图片。示例模板如下:
![excel_template.png](https://cdn.jsdelivr.net/gh/occlive/ImageHost01/excel_template.png)
3. 编写Java代码
Excel模板创建完成后,就可以使用POI库来读取模板、填充数据和图片、导出Excel文件了。以下是示例代码:
```java
import java.io.*;
import java.util.*;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.*;
public class ExcelExportUtil {
public static void export(List<Map<String, Object>> dataList, String templatePath, String exportPath) throws Exception {
InputStream is = new FileInputStream(templatePath);
XSSFWorkbook workbook = new XSSFWorkbook(is);
XSSFSheet sheet = workbook.getSheetAt(0);
int rowIndex = 1;
for (Map<String, Object> data : dataList) {
XSSFRow row = sheet.createRow(rowIndex++);
int cellIndex = 0;
for (String key : data.keySet()) {
Object value = data.get(key);
XSSFCell cell = row.createCell(cellIndex++);
if (value instanceof String) {
cell.setCellValue((String) value);
} else if (value instanceof Double) {
cell.setCellValue((Double) value);
} else if (value instanceof Date) {
cell.setCellValue((Date) value);
} else if (value instanceof Calendar) {
cell.setCellValue((Calendar) value);
} else if (value instanceof Boolean) {
cell.setCellValue((Boolean) value);
} else if (value instanceof byte[]) {
// 插入图片
int pictureIdx = workbook.addPicture((byte[]) value, Workbook.PICTURE_TYPE_JPEG);
CreationHelper helper = workbook.getCreationHelper();
Drawing drawing = sheet.createDrawingPatriarch();
ClientAnchor anchor = helper.createClientAnchor();
anchor.setCol1(cellIndex - 1);
anchor.setRow1(rowIndex - 1);
Picture pict = drawing.createPicture(anchor, pictureIdx);
pict.resize();
} else {
cell.setCellValue(value.toString());
}
}
}
OutputStream os = new FileOutputStream(exportPath);
workbook.write(os);
os.close();
}
}
```
代码解释:
- `export`方法接受一个数据列表、一个Excel模板文件路径和一个导出Excel文件路径作为参数,将数据填充到模板中并导出Excel文件
- 首先使用`FileInputStream`读取Excel模板文件,然后创建`XSSFWorkbook`和`XSSFSheet`对象
- 遍历数据列表,对于每个数据项,创建一个新的行,并为每个属性创建一个单元格,使用单元格的`setCellValue`方法填充数据
- 如果属性的值是一个图片,则调用`Workbook.addPicture`方法将图片添加到工作簿中,并使用`Sheet.createDrawingPatriarch`方法创建绘图对象,在单元格上创建图片,最后调用`Picture.resize`方法调整图片大小
- 最后使用`FileOutputStream`将工作簿写入Excel文件中
4. 调用导出方法
在main方法中调用export方法进行导出:
```java
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
List<Map<String, Object>> dataList = new ArrayList<>();
Map<String, Object> data1 = new HashMap<>();
data1.put("name", "张三");
data1.put("age", 20);
data1.put("avatar", FileUtils.readFileToByteArray(new File("avatar.jpg")));
dataList.add(data1);
Map<String, Object> data2 = new HashMap<>();
data2.put("name", "李四");
data2.put("age", 25);
data2.put("avatar", FileUtils.readFileToByteArray(new File("avatar.jpg")));
dataList.add(data2);
ExcelExportUtil.export(dataList, "template.xlsx", "export.xlsx");
}
}
```
以上代码会生成一个包含两条记录和图片的Excel文件,效果如下:
![excel_export.png](https://cdn.jsdelivr.net/gh/occlive/ImageHost01/excel_export.png)
希望对您有所帮助!
阅读全文