getColumnWidth()'s comment says "returned value is always gerater that getDefaultColumnWidth() because the latter does not include margins". But if one column keep default, getColumnWidth() will just call getDefaultColumnWidth() and return, no more margin or padding pixels added. So the returned value is always 8*256=2048, smaller than actual value. public int getColumnWidth(int columnIndex) { CTCol col = columnHelper.getColumn(columnIndex, false); double width = col == null || !col.isSetWidth() ? getDefaultColumnWidth() : col.getWidth(); return (int)(width*256); } I think we should add some extra width after call getDefaultColumnWidth(), but don't know how to calculate that.