乔山办公网我们一直在努力
您的位置:乔山办公网 > excel表格制作 > 如何利用poi对excel里的某一列的宽度进行设定

如何利用poi对excel里的某一列的宽度进行设定

作者:乔山办公网日期:

返回目录:excel表格制作


在开发中经常需要用到对Excel文件的操作,POI生成excel实现自动调整行高的代码如下:
import java.io.FileOutputStream;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.hssf.usermodel.HSSFComment;
import org.apache.poi.hssf.usermodel.HSSFPatriarch;
import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
public class PoiCreateExcelTest {
public static void main(String[] args) {
/**
* @see <a href="http://poi.apache.org/hssf/quick-guide.html#NewWorkbook">For more</a>
*/
// 创建新的Excel 工作簿
HSSFWorkbook workbook = new HSSFWorkbook();

// 在Excel工作簿中建一工作表,其名为缺省值, 也可以指定Sheet名称
HSSFSheet sheet = workbook.createSheet();
//HSSFSheet sheet = workbook.createSheet("SheetName");

// 用于格式化单元格的数据
HSSFDataFormat format = workbook.createDataFormat();

// 创建新行(row),并将单元格(cell)放入其中. 行号从0开始计算.
HSSFRow row = sheet.createRow((short) 1);
// 设置字体
HSSFFont font = workbook.createFont();
font.setFontHeightInPoints((short) 20); //字体高度
font.setColor(HSSFFont.COLOR_RED); //字体颜色
font.setFontName("黑体"); //字体
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); //宽度
font.setItalic(true); //是否使用斜体
// font.setStrikeout(true); //是否使用划线
// 设置单元格类型
HSSFCellStyle cellStyle = workbook.createCellStyle();
cellStyle.setFont(font);
cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); //水平e68a84e799bee5baa6363布局:居中
cellStyle.setWrapText(true);

// 添加单元格注释
// 创建HSSFPatriarch对象,HSSFPatriarch是所有注释的容器.
HSSFPatriarch patr = sheet.createDrawingPatriarch();
// 定义注释的大小和位置,详见文档
HSSFComment comment = patr.createComment(new HSSFClientAnchor(0, 0, 0, 0, (short)4, 2, (short) 6, 5));
// 设置注释内容
comment.setString(new HSSFRichTextString("可以在POI中添加注释!"));
// 设置注释作者. 当鼠标移动到单元格上是可以在状态栏中看到该内容.
comment.setAuthor("Xuys.");
// 创建单元格
HSSFCell cell = row.createCell((short) 1);
HSSFRichTextString hssfString = new HSSFRichTextString("Hello World!");
cell.setCellValue(hssfString);//设置单元格内容
cell.setCellStyle(cellStyle);//设置单元格样式
cell.setCellType(HSSFCell.CELL_TYPE_STRING);//指定单元格格式:数值、公式或字符串
cell.setCellComment(comment);//添加注释
//格式化数据
row = sheet.createRow((short) 2);
cell = row.createCell((short) 2);
cell.setCellValue(11111.25);
cellStyle = workbook.createCellStyle();
cellStyle.setDataFormat(format.getFormat("0.0"));
cell.setCellStyle(cellStyle);

row = sheet.createRow((short) 3);
cell = row.createCell((short) 3);
cell.setCellValue(9736279.073);
cellStyle = workbook.createCellStyle();
cellStyle.setDataFormat(format.getFormat("#,##0.0000"));
cell.setCellStyle(cellStyle);
sheet.autoSizeColumn((short)0); //调整第一列宽度
sheet.autoSizeColumn((short)1); //调整第二列宽度
sheet.autoSizeColumn((short)2); //调整第三列宽度
sheet.autoSizeColumn((short)3); //调整第四列宽度
try {
FileOutputStream fileOut = new FileOutputStream("C:/3.xls");
workbook.write(fileOut);
fileOut.close();
} catch (Exception e) {
System.out.println(e.toString());
}
}

}

EXCEL的行高度和列宽度单位是不一样的。
1,EXCEL列高度的单位是磅,Apache POI的行高度单位是缇(twip):
1英寸=72磅=25.4毫米=1440缇
1磅=0.353毫米=20缇

POI中的行高=Excel的行高度*20
Excel的行高度=POI中的行高/20

这里顺便把像素e69da5e887aae799bee5baa6362的换行方法说一下:
DPI = 1英寸内可显示的像素点个数。通常电脑屏幕是96DPI, IPhone4s的屏幕是326DPI, 普通激光黑白打印机是400DPI

要计算POI行高或者Excel的行高,就先把它行转换到英寸,再乘小DPI就可以得到像素
像素 = (磅/72)*DPI
像素= (Excel的行高度/72)*DPI
像素= (POI中的行高/20/72)*DPI
Excel的行高度=像素/DPI*72
POI中的行高=像素/DPI*72*20
例如在电脑屏幕上, Excel默认行高度为13.5, (13.5/72)*96=18像素,而Excel中也确实显示的就是18像素。

2,EXCEL列宽度的单位是字符个数
(2014-08-18备注:关于Excel的宽度计算的详细介绍在这篇文章Excel的宽度怎么算的?)
在excel2003以上的版本中,可以建立一个空白的xls文档并将第一列宽度拉到10。然后在A1单元格中输入1234567890可以看到单元格正好可以容纳这十个字符。一个字符的宽度是通过测量1234567890这十个字符在默认字体(通常是宋体11号字,视版本可能不同)下的平均宽度得到的。
只要记住一个字符的宽度是8像素 (2013-10-29备注:一个字符的宽度取决于Excel文件中的第一个字体大小,并不一定就是8像素)就可以了。
一个单元格实际的像素宽度还要在 (字符个数 * 默认字符的宽度)的基础上前后各加2个像素的空白边。另外字符之间会叠加一个像素,在计算时也要减去:
(2013-10-29备注:一个字符的边距不一定只是2像素,和字体有关系)
像素 = 2个像素空白 + (字符个数 * 默认字符的宽度) + 2个像素空白 - (字符个数 - 1)
整理一下,公式变成:
像素 = 5 + (字符个数 * (默认字符的宽度 - 1))
代入默认字符宽度8:
像素 = 5 + (字符个数 * 7)

POI中的字符宽度算法是:
double 宽度 = (字符个数 * (字符宽度 - 1) + 5) / (字符宽度 - 1) * 256;
然后再四舍五入成整数。

最后把我写的一个工具类贴上来,方便使用。
public class HSSFUtil {
private static final short TWIPS_PER_PIEXL = 15; //1 Pixel = 1440 TPI / 96 DPI = 15 Twips

public static short pixel2PoiHeight(int pixel) {
return (short) (pixel * TWIPS_PER_PIEXL);
}

public static int poiHeight2Pixel(short height) {
return height / TWIPS_PER_PIEXL;
}

//像素转poi宽度
public static int pixel2PoiWidth(FontInfo fontInfo, int pixel) {
double numChars = pixel2Character(fontInfo, pixel);
numChars *= fontInfo.charWidth;
numChars += fontInfo.spacing;
numChars /= fontInfo.charWidth;
numChars *= 256;
return (int)numChars;
}

//poi宽度转像素
public static int poiWidth2Pixel(FontInfo fontInfo, int poiWidth) {
double numChars = poiWidth2Character(fontInfo, poiWidth);
return character2Piexl(fontInfo, numChars);
}

public static double poiWidth2Character(FontInfo fontInfo, int poiWidth){
double numChars = poiWidth / 256.0 - (fontInfo.spacing * 1.0 / fontInfo.charWidth);
//2位小数
return new BigDecimal(numChars).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
}

public static int character2PoiWidth(FontInfo fontInfo, double numChars){
double w = (numChars + (fontInfo.spacing * 1.0 / fontInfo.charWidth)) * 256;
return (int) w;
}

//excel字符转像素
public static int character2Piexl(FontInfo fontInfo, double numChars){
double pixel = fontInfo.charWidth * numChars + fontInfo.spacing;
return (int)pixel;
}

//excel像素转字符
public static double pixel2Character(FontInfo fontInfo, int pixel){
double numChars = (pixel - fontInfo.spacing) * 1.0 / fontInfo.charWidth;
return new BigDecimal(numChars).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
}

//获得工作簿默认字符宽度
public static FontInfo getDefaultCharWidth(Workbook book){
//博客没人气,我已删除此段代码,请自行研究或者留邮箱
}

//获得不同字体的字符边距
private static int getSpacing(int fontHeightInPoints, int charWidth){
//博客没人气,我已删除此段代码,请自行研究或者留邮箱
}
}
方法1:用自己设计好“行高与列宽”的模板(以文件形式取名“book.xls))保存到 c:\windows\Documents and Settings\当前用户名\Application Data\Microsoft\Excel\XLSTART 文件夹下。
以后打开时就自动调用该文档模式。

方法2:宏。
在附中 宏 VB编辑器里 只要你修改行高 列宽(30,10两个数字) 随意输入,保存,再打开新表时,就能得到你想要的行高和列宽了。
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
If Sh.UsedRange.Count = 1 Then '如果使用过的单元数量为1
Sh.Cells.Rows.RowHeight = 30 '指定行高
Sh.Cells.Columns.ColumnWidth = 10 '指定列宽
End If
End Sub

如果你用的是POI插件
Row row = sheet.getRow(0);
row.setHeightInPoints(30);

相关阅读

  • -excel2013行高设置,excel的行高怎么设置

  • 乔山办公网excel表格制作
  • 设置列宽的方法/步骤1以调整B列单元格列宽为例,单击copyB,选中B列单元格。2右键单击B单元格,选中【列宽】3在列百宽中输入数字,点击【确定】4调整列宽后的表格END设置行高度的方
  • 怎么样用<em>vb</em>或<em>vb</em>a设置<em

  • 乔山办公网excel表格制作
  • 首先在VB中引用microsoft excel object library 假设c盘根目录下有个1.xls的文件 …………问题补充:你的要求很简单,一行指令恐怕不行,最少要三行代码如下:Private Sub Form_Load()Dim xlApp As Exc
关键词不能为空
极力推荐

ppt怎么做_excel表格制作_office365_word文档_365办公网