Excel像素转列宽

    之前列宽需要转像素的场景,通过设置列宽获取了npoi列宽、vba列宽、vba像素的关系,Excel列宽转像素,本来想着反向是没结果的,因为npoi列宽对应的像素是通过四舍五入算出来的,反向应该实给不出具体列宽值。结果在拖动excel列的的时候发现两个现象:
    1、列宽在拖动过程中像素并没有出现小数,1、2、3、4、5、6、7、8、9、10......
    2、自己设置的值最终变成了一个临近值,比如我分别设置列宽0.74,0.75,0.76,0.77,0.78,0.79,0.8这些值后重新再查看列宽,这时候列宽都变成了0.77
image

    如果想要像素完全映射到excel那么需要将自己的像素值都处理成整数,这样才可能将像素值和excel对应起来。同时也意识到可能npoi列宽设置某个范围的值最终都只会映射到具体某个像素,那么这时候npoi的列宽不管设置的起始值还是终点值起始对excel来说都没有太大区别,比如320-330起始都对应10px,那么10px完全可以反推回320的npoi列宽image
    如果不是很精确的情况下像素转列宽其实有了一定规律。比如像素都是整数的情况下就能算出一个合适的列宽。但是有一定限制条件:1、windows机器dpi是96 2、excel07 3、sheet的默认字体是Calibri 11pt

NPOI列宽=像素*32

    可以通过以下代码验证生成的excel对应的像素是否正确

点击查看代码
var workbook = new XSSFWorkbook();
var sheet = workbook.CreateSheet("My Sheet");
foreach (var i in Enumerable.Range(0,20).ToList())
{
    var colWidthPx = i + 1;
    sheet.SetColumnWidth(i, (int)PixelToExcelCharWidth(colWidthPx));
}
workbook.Write(File.Open("output.xlsx", FileMode.Create));



 static decimal PixelToExcelCharWidth(decimal pxValue)
{
    return pxValue * 32m;
}
posted @ 2026-01-16 16:52  xiaoyaomuma  阅读(1)  评论(0)    收藏  举报