mirror of
https://gitee.com/chinabugotech/hutool.git
synced 2025-05-09 23:51:34 +08:00
feat: Add widthRatio parameter for Excel autoSizeColumn
This commit is contained in:
parent
02a38a4f52
commit
fdf9d5dd5e
@ -30,12 +30,7 @@ import java.io.File;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
import java.nio.charset.Charset;
|
import java.nio.charset.Charset;
|
||||||
import java.util.Comparator;
|
import java.util.*;
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.LinkedHashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.TreeMap;
|
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -241,9 +236,22 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
|
|||||||
* @since 4.0.12
|
* @since 4.0.12
|
||||||
*/
|
*/
|
||||||
public ExcelWriter autoSizeColumnAll() {
|
public ExcelWriter autoSizeColumnAll() {
|
||||||
|
return autoSizeColumnAll(0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置所有列为自动宽度,不考虑合并单元格<br>
|
||||||
|
* 此方法必须在指定列数据完全写出后调用才有效。<br>
|
||||||
|
* 列数计算是通过第一行计算的
|
||||||
|
*
|
||||||
|
* @param widthRatio 列宽的倍数。如果所有内容都是英文,可以设为1,如果有中文,建议设置为 1.6-2.0之间。
|
||||||
|
* @return this
|
||||||
|
* @since 5.8.30
|
||||||
|
*/
|
||||||
|
public ExcelWriter autoSizeColumnAll(float widthRatio) {
|
||||||
final int columnCount = this.getColumnCount();
|
final int columnCount = this.getColumnCount();
|
||||||
for (int i = 0; i < columnCount; i++) {
|
for (int i = 0; i < columnCount; i++) {
|
||||||
autoSizeColumn(i);
|
autoSizeColumn(i, widthRatio);
|
||||||
}
|
}
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
@ -257,8 +265,7 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
|
|||||||
* @since 4.0.12
|
* @since 4.0.12
|
||||||
*/
|
*/
|
||||||
public ExcelWriter autoSizeColumn(int columnIndex) {
|
public ExcelWriter autoSizeColumn(int columnIndex) {
|
||||||
this.sheet.autoSizeColumn(columnIndex);
|
return autoSizeColumn(columnIndex, false);
|
||||||
return this;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -271,7 +278,37 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
|
|||||||
* @since 3.3.0
|
* @since 3.3.0
|
||||||
*/
|
*/
|
||||||
public ExcelWriter autoSizeColumn(int columnIndex, boolean useMergedCells) {
|
public ExcelWriter autoSizeColumn(int columnIndex, boolean useMergedCells) {
|
||||||
this.sheet.autoSizeColumn(columnIndex, useMergedCells);
|
return autoSizeColumn(columnIndex, useMergedCells, 0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置某列为自动宽度。注意有中文的情况下,需要根据需求调整宽度扩大比例。<br>
|
||||||
|
* 此方法必须在指定列数据完全写出后调用才有效。
|
||||||
|
*
|
||||||
|
* @param columnIndex 第几列,从0计数
|
||||||
|
* @param widthRatio 列宽的倍数。如果所有内容都是英文,可以设为1,如果有中文,建议设置为 1.6-2.0之间。
|
||||||
|
* @return this
|
||||||
|
* @since 5.8.30
|
||||||
|
*/
|
||||||
|
public ExcelWriter autoSizeColumn(int columnIndex, float widthRatio) {
|
||||||
|
return autoSizeColumn(columnIndex, false, widthRatio);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置某列为自动宽度。注意有中文的情况下,需要根据需求调整宽度扩大比例。<br>
|
||||||
|
* 此方法必须在指定列数据完全写出后调用才有效。
|
||||||
|
*
|
||||||
|
* @param columnIndex 第几列,从0计数
|
||||||
|
* @param useMergedCells 是否适用于合并单元格
|
||||||
|
* @param widthRatio 列宽的倍数。如果所有内容都是英文,可以设为1,如果有中文,建议设置为 1.6-2.0之间。
|
||||||
|
* @return this
|
||||||
|
* @since 5.8.30
|
||||||
|
*/
|
||||||
|
public ExcelWriter autoSizeColumn(int columnIndex, boolean useMergedCells, float widthRatio) {
|
||||||
|
sheet.autoSizeColumn(columnIndex, useMergedCells);
|
||||||
|
if (widthRatio > 0) {
|
||||||
|
sheet.setColumnWidth(columnIndex, (int) (sheet.getColumnWidth(columnIndex) * widthRatio));
|
||||||
|
}
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,15 +12,7 @@ import cn.hutool.core.util.ObjectUtil;
|
|||||||
import cn.hutool.poi.excel.cell.setters.EscapeStrCellSetter;
|
import cn.hutool.poi.excel.cell.setters.EscapeStrCellSetter;
|
||||||
import cn.hutool.poi.excel.style.StyleUtil;
|
import cn.hutool.poi.excel.style.StyleUtil;
|
||||||
import org.apache.poi.common.usermodel.HyperlinkType;
|
import org.apache.poi.common.usermodel.HyperlinkType;
|
||||||
import org.apache.poi.ss.usermodel.BorderStyle;
|
import org.apache.poi.ss.usermodel.*;
|
||||||
import org.apache.poi.ss.usermodel.BuiltinFormats;
|
|
||||||
import org.apache.poi.ss.usermodel.CellStyle;
|
|
||||||
import org.apache.poi.ss.usermodel.FillPatternType;
|
|
||||||
import org.apache.poi.ss.usermodel.Font;
|
|
||||||
import org.apache.poi.ss.usermodel.HorizontalAlignment;
|
|
||||||
import org.apache.poi.ss.usermodel.Hyperlink;
|
|
||||||
import org.apache.poi.ss.usermodel.IndexedColors;
|
|
||||||
import org.apache.poi.ss.usermodel.VerticalAlignment;
|
|
||||||
import org.apache.poi.ss.util.CellRangeAddressList;
|
import org.apache.poi.ss.util.CellRangeAddressList;
|
||||||
import org.apache.poi.xssf.usermodel.XSSFRichTextString;
|
import org.apache.poi.xssf.usermodel.XSSFRichTextString;
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
@ -28,15 +20,7 @@ import org.junit.Ignore;
|
|||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.LinkedHashMap;
|
|
||||||
import java.util.LinkedList;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.TreeMap;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 写出Excel单元测试
|
* 写出Excel单元测试
|
||||||
@ -45,6 +29,23 @@ import java.util.TreeMap;
|
|||||||
*/
|
*/
|
||||||
public class ExcelWriteTest {
|
public class ExcelWriteTest {
|
||||||
|
|
||||||
|
public static Map<String, Object> MAP_DATA_1 = new LinkedHashMap<>();
|
||||||
|
public static Map<String, Object> MAP_DATA_2 = new LinkedHashMap<>();
|
||||||
|
|
||||||
|
static {
|
||||||
|
MAP_DATA_1.put("姓名", "张三");
|
||||||
|
MAP_DATA_1.put("年龄", 23);
|
||||||
|
MAP_DATA_1.put("成绩", 88.32);
|
||||||
|
MAP_DATA_1.put("是否合格", true);
|
||||||
|
MAP_DATA_1.put("考试日期", DateUtil.date());
|
||||||
|
|
||||||
|
MAP_DATA_2.put("姓名", "张三");
|
||||||
|
MAP_DATA_2.put("年龄", 23);
|
||||||
|
MAP_DATA_2.put("成绩", 88.32);
|
||||||
|
MAP_DATA_2.put("是否合格", true);
|
||||||
|
MAP_DATA_2.put("考试日期", DateUtil.date());
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void writeNoFlushTest() {
|
public void writeNoFlushTest() {
|
||||||
List<?> row1 = CollUtil.newArrayList("aaaaa", "bb", "cc", "dd", DateUtil.date(), 3.22676575765);
|
List<?> row1 = CollUtil.newArrayList("aaaaa", "bb", "cc", "dd", DateUtil.date(), 3.22676575765);
|
||||||
@ -200,26 +201,13 @@ public class ExcelWriteTest {
|
|||||||
@Test
|
@Test
|
||||||
@Ignore
|
@Ignore
|
||||||
public void mergeTest2() {
|
public void mergeTest2() {
|
||||||
Map<String, Object> row1 = new LinkedHashMap<>();
|
|
||||||
row1.put("姓名", "张三");
|
|
||||||
row1.put("年龄", 23);
|
|
||||||
row1.put("成绩", 88.32);
|
|
||||||
row1.put("是否合格", true);
|
|
||||||
row1.put("考试日期", DateUtil.date());
|
|
||||||
|
|
||||||
Map<String, Object> row2 = new LinkedHashMap<>();
|
ArrayList<Map<String, Object>> rows = CollUtil.newArrayList(MAP_DATA_1, MAP_DATA_2);
|
||||||
row2.put("姓名", "李四");
|
|
||||||
row2.put("年龄", 33);
|
|
||||||
row2.put("成绩", 59.50);
|
|
||||||
row2.put("是否合格", false);
|
|
||||||
row2.put("考试日期", DateUtil.date());
|
|
||||||
|
|
||||||
ArrayList<Map<String, Object>> rows = CollUtil.newArrayList(row1, row2);
|
|
||||||
|
|
||||||
// 通过工具类创建writer
|
// 通过工具类创建writer
|
||||||
ExcelWriter writer = ExcelUtil.getWriter("d:/test/writeMapTest.xlsx");
|
ExcelWriter writer = ExcelUtil.getWriter("d:/test/writeMapTest.xlsx");
|
||||||
// 合并单元格后的标题行,使用默认标题样式
|
// 合并单元格后的标题行,使用默认标题样式
|
||||||
writer.merge(row1.size() - 1, "一班成绩单");
|
writer.merge(MAP_DATA_1.size() - 1, "一班成绩单");
|
||||||
|
|
||||||
// 一次性写出内容,使用默认样式,强制输出标题
|
// 一次性写出内容,使用默认样式,强制输出标题
|
||||||
writer.write(rows, true);
|
writer.write(rows, true);
|
||||||
@ -230,21 +218,8 @@ public class ExcelWriteTest {
|
|||||||
@Test
|
@Test
|
||||||
@Ignore
|
@Ignore
|
||||||
public void writeMapTest() {
|
public void writeMapTest() {
|
||||||
Map<String, Object> row1 = new LinkedHashMap<>();
|
|
||||||
row1.put("姓名", "张三");
|
|
||||||
row1.put("年龄", 23);
|
|
||||||
row1.put("成绩", 88.32);
|
|
||||||
row1.put("是否合格", true);
|
|
||||||
row1.put("考试日期", DateUtil.date());
|
|
||||||
|
|
||||||
Map<String, Object> row2 = new LinkedHashMap<>();
|
ArrayList<Map<String, Object>> rows = CollUtil.newArrayList(MAP_DATA_1, MAP_DATA_2);
|
||||||
row2.put("姓名", "李四");
|
|
||||||
row2.put("年龄", 33);
|
|
||||||
row2.put("成绩", 59.50);
|
|
||||||
row2.put("是否合格", false);
|
|
||||||
row2.put("考试日期", DateUtil.date());
|
|
||||||
|
|
||||||
ArrayList<Map<String, Object>> rows = CollUtil.newArrayList(row1, row2);
|
|
||||||
|
|
||||||
// 通过工具类创建writer
|
// 通过工具类创建writer
|
||||||
ExcelWriter writer = ExcelUtil.getWriter("e:/excel/writeMapTest.xlsx");
|
ExcelWriter writer = ExcelUtil.getWriter("e:/excel/writeMapTest.xlsx");
|
||||||
@ -257,7 +232,7 @@ public class ExcelWriteTest {
|
|||||||
writer.getStyleSet().setFont(font, true);
|
writer.getStyleSet().setFont(font, true);
|
||||||
|
|
||||||
// 合并单元格后的标题行,使用默认标题样式
|
// 合并单元格后的标题行,使用默认标题样式
|
||||||
writer.merge(row1.size() - 1, "一班成绩单");
|
writer.merge(MAP_DATA_1.size() - 1, "一班成绩单");
|
||||||
// 一次性写出内容,使用默认样式
|
// 一次性写出内容,使用默认样式
|
||||||
writer.write(rows, true);
|
writer.write(rows, true);
|
||||||
// 关闭writer,释放内存
|
// 关闭writer,释放内存
|
||||||
@ -267,18 +242,12 @@ public class ExcelWriteTest {
|
|||||||
@Test
|
@Test
|
||||||
@Ignore
|
@Ignore
|
||||||
public void writeMapTest2() {
|
public void writeMapTest2() {
|
||||||
Map<String, Object> row1 = MapUtil.newHashMap(true);
|
|
||||||
row1.put("姓名", "张三");
|
|
||||||
row1.put("年龄", 23);
|
|
||||||
row1.put("成绩", 88.32);
|
|
||||||
row1.put("是否合格", true);
|
|
||||||
row1.put("考试日期", DateUtil.date());
|
|
||||||
|
|
||||||
// 通过工具类创建writer
|
// 通过工具类创建writer
|
||||||
ExcelWriter writer = ExcelUtil.getWriter("e:/writeMapTest2.xlsx");
|
ExcelWriter writer = ExcelUtil.getWriter("d:/writeMapTest2.xlsx");
|
||||||
|
|
||||||
// 一次性写出内容,使用默认样式
|
// 一次性写出内容,使用默认样式
|
||||||
writer.writeRow(row1, true);
|
writer.writeRow(MAP_DATA_1, true);
|
||||||
// 关闭writer,释放内存
|
// 关闭writer,释放内存
|
||||||
writer.close();
|
writer.close();
|
||||||
}
|
}
|
||||||
@ -286,12 +255,6 @@ public class ExcelWriteTest {
|
|||||||
@Test
|
@Test
|
||||||
@Ignore
|
@Ignore
|
||||||
public void writeMapWithStyleTest() {
|
public void writeMapWithStyleTest() {
|
||||||
Map<String, Object> row1 = MapUtil.newHashMap(true);
|
|
||||||
row1.put("姓名", "张三");
|
|
||||||
row1.put("年龄", 23);
|
|
||||||
row1.put("成绩", 88.32);
|
|
||||||
row1.put("是否合格", true);
|
|
||||||
row1.put("考试日期", DateUtil.date());
|
|
||||||
|
|
||||||
// 通过工具类创建writer
|
// 通过工具类创建writer
|
||||||
String path = "f:/test/writeMapWithStyleTest.xlsx";
|
String path = "f:/test/writeMapWithStyleTest.xlsx";
|
||||||
@ -300,7 +263,7 @@ public class ExcelWriteTest {
|
|||||||
writer.setStyleSet(null);
|
writer.setStyleSet(null);
|
||||||
|
|
||||||
// 一次性写出内容,使用默认样式
|
// 一次性写出内容,使用默认样式
|
||||||
writer.writeRow(row1, true);
|
writer.writeRow(MAP_DATA_1, true);
|
||||||
|
|
||||||
// 设置某个单元格样式
|
// 设置某个单元格样式
|
||||||
CellStyle orCreateRowStyle = writer.getOrCreateCellStyle(0, 1);
|
CellStyle orCreateRowStyle = writer.getOrCreateCellStyle(0, 1);
|
||||||
@ -335,8 +298,8 @@ public class ExcelWriteTest {
|
|||||||
writer.addHeaderAlias("name", "姓名");
|
writer.addHeaderAlias("name", "姓名");
|
||||||
writer.addHeaderAlias("age", "年龄");
|
writer.addHeaderAlias("age", "年龄");
|
||||||
writer.addHeaderAlias("score", "分数");
|
writer.addHeaderAlias("score", "分数");
|
||||||
writer.addHeaderAlias("isPass", "是否通过");
|
writer.addHeaderAlias("isPass", "是否合格");
|
||||||
writer.addHeaderAlias("examDate", "考试时间");
|
writer.addHeaderAlias("examDate", "考试日期");
|
||||||
// 合并单元格后的标题行,使用默认标题样式
|
// 合并单元格后的标题行,使用默认标题样式
|
||||||
writer.merge(4, "一班成绩单");
|
writer.merge(4, "一班成绩单");
|
||||||
// 一次性写出内容,使用默认样式
|
// 一次性写出内容,使用默认样式
|
||||||
@ -445,21 +408,21 @@ public class ExcelWriteTest {
|
|||||||
@Test
|
@Test
|
||||||
@Ignore
|
@Ignore
|
||||||
public void writeBeanTest() {
|
public void writeBeanTest() {
|
||||||
cn.hutool.poi.excel.TestBean bean1 = new cn.hutool.poi.excel.TestBean();
|
TestBean bean1 = new TestBean();
|
||||||
bean1.setName("张三");
|
bean1.setName("张三");
|
||||||
bean1.setAge(22);
|
bean1.setAge(22);
|
||||||
bean1.setPass(true);
|
bean1.setPass(true);
|
||||||
bean1.setScore(66.30);
|
bean1.setScore(66.30);
|
||||||
bean1.setExamDate(DateUtil.date());
|
bean1.setExamDate(DateUtil.date());
|
||||||
|
|
||||||
cn.hutool.poi.excel.TestBean bean2 = new cn.hutool.poi.excel.TestBean();
|
TestBean bean2 = new TestBean();
|
||||||
bean2.setName("李四");
|
bean2.setName("李四");
|
||||||
bean2.setAge(28);
|
bean2.setAge(28);
|
||||||
bean2.setPass(false);
|
bean2.setPass(false);
|
||||||
bean2.setScore(38.50);
|
bean2.setScore(38.50);
|
||||||
bean2.setExamDate(DateUtil.date());
|
bean2.setExamDate(DateUtil.date());
|
||||||
|
|
||||||
List<cn.hutool.poi.excel.TestBean> rows = CollUtil.newArrayList(bean1, bean2);
|
List<TestBean> rows = CollUtil.newArrayList(bean1, bean2);
|
||||||
// 通过工具类创建writer
|
// 通过工具类创建writer
|
||||||
String file = "e:/writeBeanTest.xlsx";
|
String file = "e:/writeBeanTest.xlsx";
|
||||||
FileUtil.del(file);
|
FileUtil.del(file);
|
||||||
@ -481,17 +444,17 @@ public class ExcelWriteTest {
|
|||||||
@Test
|
@Test
|
||||||
@Ignore
|
@Ignore
|
||||||
public void writeBeanTest2() {
|
public void writeBeanTest2() {
|
||||||
cn.hutool.poi.excel.OrderExcel order1 = new cn.hutool.poi.excel.OrderExcel();
|
OrderExcel order1 = new OrderExcel();
|
||||||
order1.setId("1");
|
order1.setId("1");
|
||||||
order1.setNum("123");
|
order1.setNum("123");
|
||||||
order1.setBody("body1");
|
order1.setBody("body1");
|
||||||
|
|
||||||
cn.hutool.poi.excel.OrderExcel order2 = new cn.hutool.poi.excel.OrderExcel();
|
OrderExcel order2 = new OrderExcel();
|
||||||
order1.setId("2");
|
order1.setId("2");
|
||||||
order1.setNum("456");
|
order1.setNum("456");
|
||||||
order1.setBody("body2");
|
order1.setBody("body2");
|
||||||
|
|
||||||
List<cn.hutool.poi.excel.OrderExcel> rows = CollUtil.newArrayList(order1, order2);
|
List<OrderExcel> rows = CollUtil.newArrayList(order1, order2);
|
||||||
// 通过工具类创建writer
|
// 通过工具类创建writer
|
||||||
String file = "f:/test/writeBeanTest2.xlsx";
|
String file = "f:/test/writeBeanTest2.xlsx";
|
||||||
FileUtil.del(file);
|
FileUtil.del(file);
|
||||||
@ -916,4 +879,17 @@ public class ExcelWriteTest {
|
|||||||
|
|
||||||
writer.close();
|
writer.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Ignore
|
||||||
|
public void autoSizeColumnTest() {
|
||||||
|
|
||||||
|
Map<String, Object> map = new LinkedHashMap<>(MAP_DATA_1);
|
||||||
|
map.put("中文长度测试(符号)", "abc");
|
||||||
|
|
||||||
|
try (ExcelWriter writer = new ExcelWriter("d:/autoSizeColumnTest.xlsx")) {
|
||||||
|
writer.writeRow(map, true);
|
||||||
|
writer.autoSizeColumnAll(2f);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user