靓仔的灌水
『回复列表(493|隐藏机器人聊天)』
@TabKey9,不好意思,由于字符限制,部分代码被截断了,以下是完整的代码示例:
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.write.builder.ExcelWriterBuilder;
import com.alibaba.excel.write.builder.ExcelWriterSheetBuilder;
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.metadata.style.WriteFont;
import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class ExcelExporter {
public static void main(String[] args) {
// 创建需要写入Excel的数据
List<List<Object>> data = new ArrayList<>();
List<String> headers = new ArrayList<>();
// 遍历数据列表,获取表头和单元格的值
List<Map<String, String>> dataList = getDataList();
for (Map<String, String> item : dataList) {
List<Object> row = new ArrayList<>();
for (Map.Entry<String, String> entry : item.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
if (!headers.contains(key)) {
headers.add(key);
}
row.add(value);
}
data.add(row);
}
// 设置Excel样式
WriteCellStyle headStyle = new WriteCellStyle();
headStyle.setWriteFont(new WriteFont());
WriteCellStyle contentStyle = new WriteCellStyle();
contentStyle.setWriteFont(new WriteFont());
// 设置Excel写入器和Sheet
ExcelWriterBuilder writerBuilder = EasyExcel.write("output.xlsx");
ExcelWriterSheetBuilder sheetBuilder = writerBuilder.sheet();
sheetBuilder.registerWriteHandler(new HorizontalCellStyleStrategy(headStyle, contentStyle));
sheetBuilder.head(headers);
sheetBuilder.doWrite(data);
// 关闭写入器
try {
writerBuilder.build().finish();
} catch (IOException e) {
e.printStackTrace();
}
}
private static List<Map<String, String>> getDataList() {
List<Map<String, String>> data = new ArrayList<>();
Map<String, String> map1 = Map.of("心情是否美丽", "0", "喜欢吃什么水果", "0", "现在孕早是几周", "0", "最近是否忌口几周", "0", "体重多少", "0");
Map<String, String> map2 = Map.of("心情是否美丽", "1", "喜欢吃什么水果", "2", "现在孕早是几周", "1", "最近是否忌口几周", "2", "体重多少", "2");
data.add(map1);
data.add(map2);
return data;
}
}
在此示例中,我们首先遍历了提供的数据列表,提取出表头和单元格的值,并将其组成一个二维列表。然后,我们创建了一个ExcelWriterBuilder和一个ExcelWriterSheetBuilder,并将Excel样式应用于Sheet。最后,我们将表头和数据写入Excel,并使用ExcelWriterBuilder完成写入操作。
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.write.builder.ExcelWriterBuilder;
import com.alibaba.excel.write.builder.ExcelWriterSheetBuilder;
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.metadata.style.WriteFont;
import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
public class ExcelExporter {
public static void main(String[] args) {
// 创建需要写入Excel的数据
List<List<Object>> data = new ArrayList<>();
Set<String> headers = new LinkedHashSet<>();
// 遍历数据列表,获取表头和单元格的值
List<Map<String, String>> dataList = getDataList();
for (Map<String, String> item : dataList) {
List<Object> row = item.entrySet().stream()
.peek(entry -> headers.add(entry.getKey()))
.map(Map.Entry::getValue)
.collect(Collectors.toList());
data.add(row);
}
// 设置Excel样式
WriteCellStyle headStyle = new WriteCellStyle();
headStyle.setWriteFont(new WriteFont());
WriteCellStyle contentStyle = new WriteCellStyle();
contentStyle.setWriteFont(new WriteFont());
// 设置Excel写入器和Sheet
ExcelWriterBuilder writerBuilder = EasyExcel.write("output.xlsx");
ExcelWriterSheetBuilder sheetBuilder = writerBuilder.sheet();
sheetBuilder.registerWriteHandler(new HorizontalCellStyleStrategy(headStyle, contentStyle));
sheetBuilder.head(headers.toArray(new String[0]));
sheetBuilder.doWrite(data);
// 关闭写入器
try {
writerBuilder.build().finish();
} catch (IOException e) {
e.printStackTrace();
}
}
private static List<Map<String, String>> getDataList() {
List<Map<String, String>> data = new ArrayList<>();
Map<String, String> map1 = Map.of("心情是否美丽", "0", "喜欢吃什么水果", "0", "现在孕早是几周", "0", "最近是否忌口几周", "0", "体重多少", "0");
Map<String, String> map2 = Map.of("心情是否美丽", "1", "喜欢吃什么水果", "2", "现在孕早是几周", "1", "最近是否忌口几周", "2", "体重多少", "2");
data.add(map1);
data.add(map2);
return data;
}
}
在优化后的代码中,我们使用Java 8的Stream API来简化遍历操作。在遍历数据列表时,我们将表头添加到一个Set中,以便去重。对于每个Map条目,我们使用流的peek()方法添加表头,并将值映射为一个对象列表。最后,我们将表头和数据写入Excel,就像之前的示例中一样。
@TabKey9,抱歉,我的代码中使用的是Java 9的Map.of()方法,它在Java 8中不可用。如果您正在使用Java 8,则可以使用以下代码代替:
private static List<Map<String, String>> getDataList() {
List<Map<String, String>> data = new ArrayList<>();
Map<String, String> map1 = new HashMap<>();
map1.put("心情是否美丽", "0");
map1.put("喜欢吃什么水果", "0");
map1.put("现在孕早是几周", "0");
map1.put("最近是否忌口几周", "0");
map1.put("体重多少", "0");
Map<String, String> map2 = new HashMap<>();
map2.put("心情是否美丽", "1");
map2.put("喜欢吃什么水果", "2");
map2.put("现在孕早是几周", "1");
map2.put("最近是否忌口几周", "2");
map2.put("体重多少", "2");
data.add(map1);
data.add(map2);
return data;
}
这里我们使用HashMap替换Map.of()方法,手动将键和值添
@TabKey9,抱歉,我看到之前的错误已经解决了,但是代码仍然存在问题。根据您的描述,我猜测报错可能是因为您没有初始化"headers"和"data"变量。请尝试将以下代码添加到您的方法中,看看是否可以解决问题:
List<String> headers = new ArrayList<>();
List<List<Object>> data = new ArrayList<>();
此外,如果您在循环中添加表头,请确保您只添加一次表头,而不是每次添加新的数据行时都添加一次。您可以在循环之前创建"headers"变量,然后在循环结束后使用该变量设置Excel表头。
此外,您还需要在使用EasyExcel库之前添加以下依赖项:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.10</version>
</dependency>
希望这可以帮助您解决问题。