OpenXML:Excel 中自动调整列宽

2024-03-02

我已经编写了使用 OpenXML 生成 Excel 文件的代码。 下面是在 Excel 中生成列的代码。

Worksheet worksheet = new Worksheet();
Columns columns = new Columns();
int numCols = dt1.Columns.Count;
for (int col = 0; col < numCols; col++)
{
    Column c = CreateColumnData((UInt32)col + 1, (UInt32)numCols + 1, 20.42578125D);

    columns.Append(c);
}
worksheet.Append(columns);

另外,我尝试在下面一行创建列。

Column c = new Column
{
    Min = (UInt32Value)1U,
    Max = (UInt32Value)1U,
    Width = 25.42578125D,
    BestFit = true,
    CustomWidth = true
};

我想用BestFit它应该有效。但它没有设置自动大小。


不幸的是你必须自己计算

这就是我所拥有的。它适用于我的表格数据,其中包含一些额外的代码来处理我设置的某些样式。它无论如何都不完美,但可以满足我的需要。

 private WorksheetPart mySheetPart;
 private void WriteToTable()
 {
      //Get your sheet data - write Rows and Cells
      SheetData sheetData = GetSheetData();

      //get your columns (where your width is set)
      Columns columns = AutoSize(sheetData);

      //add to a WorksheetPart.WorkSheet
      mySheetPart.Worksheet = new Worksheet();
      mySheetPart.Worksheet.Append(columns);
      mySheetPart.Worksheet.Append(sheetData);
 }

 private Columns AutoSize(SheetData sheetData)
 {
        var maxColWidth = GetMaxCharacterWidth(sheetData);

        Columns columns = new Columns();
        //this is the width of my font - yours may be different
        double maxWidth = 7;
        foreach (var item in maxColWidth)
        {
            //width = Truncate([{Number of Characters} * {Maximum Digit Width} + {5 pixel padding}]/{Maximum Digit Width}*256)/256
            double width = Math.Truncate((item.Value * maxWidth + 5) / maxWidth * 256) / 256;

            //pixels=Truncate(((256 * {width} + Truncate(128/{Maximum Digit Width}))/256)*{Maximum Digit Width})
            double pixels = Math.Truncate(((256 * width + Math.Truncate(128 / maxWidth)) / 256) * maxWidth);

            //character width=Truncate(({pixels}-5)/{Maximum Digit Width} * 100+0.5)/100
            double charWidth = Math.Truncate((pixels - 5) / maxWidth * 100 + 0.5) / 100;

            Column col = new Column() { BestFit = true, Min = (UInt32)(item.Key + 1), Max = (UInt32)(item.Key + 1), CustomWidth = true, Width = (DoubleValue)width };
            columns.Append(col);
        }

        return columns;
  }


  private Dictionary<int, int> GetMaxCharacterWidth(SheetData sheetData)
    {
        //iterate over all cells getting a max char value for each column
        Dictionary<int, int> maxColWidth = new Dictionary<int, int>();
        var rows = sheetData.Elements<Row>();
        UInt32[] numberStyles = new UInt32[] { 5, 6, 7, 8 }; //styles that will add extra chars
        UInt32[] boldStyles = new UInt32[] { 1, 2, 3, 4, 6, 7, 8 }; //styles that will bold
        foreach (var r in rows)
        {
            var cells = r.Elements<Cell>().ToArray();

            //using cell index as my column
            for (int i = 0; i < cells.Length; i++)
            {
                var cell = cells[i];
                var cellValue = cell.CellValue == null ? string.Empty : cell.CellValue.InnerText;
                var cellTextLength = cellValue.Length;

                if (cell.StyleIndex != null && numberStyles.Contains(cell.StyleIndex))
                {
                    int thousandCount = (int)Math.Truncate((double)cellTextLength / 4);

                    //add 3 for '.00' 
                    cellTextLength += (3 + thousandCount);
                }

                if (cell.StyleIndex != null && boldStyles.Contains(cell.StyleIndex))
                {
                    //add an extra char for bold - not 100% acurate but good enough for what i need.
                    cellTextLength += 1;
                }

                if (maxColWidth.ContainsKey(i))
                {
                    var current = maxColWidth[i];
                    if (cellTextLength > current)
                    {
                        maxColWidth[i] = cellTextLength;
                    }
                }
                else
                {
                    maxColWidth.Add(i, cellTextLength);
                }
            }
        }

        return maxColWidth;
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenXML:Excel 中自动调整列宽 的相关文章

随机推荐

  • XCode 无法识别引用的 AudioKit 框架

    当我创建一个引用 而不是 CocoaPods 等 AudioKit 框架之一的新 XCode 项目时 XCode 不会自动完成 AudioKit 声明 并且显式声明 AudioKit 对象 例如 AKMIDISampler 会导致生成错误
  • Kafka:获取偏移量超出分区范围。如何避免数据丢失?

    Fetcher INFO Fetch offset is out of range for partition resetting offset 试图了解发生这种情况时会发生什么 如果我们试图读取的偏移量丢失了 我假设是因为kafka GC
  • AWS s3api json格式错误:解析参数'cli-input-json'时出错:无效的JSON:期望值:第1行第1列(字符0)

    不确定我的 json 格式出了什么问题 只是想测试 aws cli 并运行aws s3api list objects cli input json
  • “git format-patch”和“git diff”有什么区别?

    我没有看到 git format patch 和 git diff 的输出有什么区别 有什么区别吗 我是否能够使用 git diff 生成补丁 然后使用 git apply 应用它 我的问题是我已将更改添加到索引中 但显然 git form
  • Jquery改变背景颜色

    我正在用这个例子尝试jquery document ready function button mouseover function p 44 test css background color yellow p 44 test hide
  • Perl 的类似 Lint 的程序?

    我正在寻找 Perl 的 lint 它可以捕获死代码和其他潜在问题 有什么建议么 I have use strict use warnings 已经有了 但我想要更多 Perl 评论家 http search cpan org perldo
  • li或dl中嵌套div的HTML5标准

    我知道 HTML5 中不允许在 li 中嵌套 div 尽管可以并且它可以工作 这是否意味着我不应该使用它 dls中嵌套div的标准是什么 此信息不正确 div元素被视为flow content https html spec whatwg
  • 如何通过 cpanel/whm API 创建数据库?

    我有 API 在专用服务器上为用户创建帐户 创建电子邮件地址也很好 但是当我尝试通过 API 创建 mysql 数据库时 我收到错误消息 访问被拒绝 即使访问是 root 我尝试使用的代码 xmlapi new xmlapi host xm
  • Asp.Net MVC 每个请求的唯一 ID

    在我们的 MVC 5 站点中 没有会话 我们需要为每个请求获取 生成一个唯一的 ID 这将用作记录请求中所有活动的 ID 有没有办法为请求分配 获取值以启用此功能 将其添加到请求项集合 odetocode com articles 111
  • iOS 7、iPhone、接近传感器

    这是一个简短的问题 但它困扰了我整整一个晚上 我这里有一些自己的应用程序 我只编写 Objective C 并且使用 ARC 如果我在 appDelegate 中编写 application didFinishLaunching UIDev
  • JavaScript 实例化

    你能在下面的例子中告诉我为什么吗sub instanceof Super is false function Super var obj prop1 value1 return obj var sub new Super sub insta
  • 带变量的 iframe 源

    我有一些问题 Is 与 HTMLIFrameElement 相同吗 Why 工作正常 但是 a document getElementsByTagName body 0 b document createElement iframe b s
  • 模块“PDO”已加载到未知行 0

    我将 nginx 与 php5 fpm 一起使用 由于某种原因 我的 php5 fpm 一直说 模块 PDO 已经加载到未知的第 0 行 老实说 我不知道为什么 该扩展不会加载到 php ini 内部 而是从 with config fil
  • 溢出隐藏隐藏下拉菜单,但将溢出隐藏隐藏在隐藏导航背景中

    首先 这是一个 js 小提琴 http jsfiddle net B6DSv http jsfiddle net B6DSv 我遇到的问题是我的 css nav overflow hidden THIS LINE background co
  • ASP.NET WebApi DateTimeOffset 序列化为 Json/JavaScript (angular2)

    我没有找到一个很好的方法来获取 JavaScript Angular2 的 DateTimeOffset 值 我正在使用 WebApi 5 2 3 和 angular2 在网上我看到日期如下 RecordModifiedAt 2016 03
  • OpenGL ES 2.0 中的光线拾取

    我正在尝试在 OpenGL ES 2 0 中实现光线拾取以确定是否已单击对象 到目前为止 我只是想检查是否已按下特定的三角形 我使用这个网站作为动力http android raypick blogspot ca 2012 04 first
  • CodeIgniter 仅允许在登录时访问某些控制器

    我有一些 CodeIgniter 控制器 只能由已登录的用户访问 即 this gt session gt userdata username 不为空 如果未经身份验证的人尝试访问所述控制器 他们应该收到 header location a
  • chromedriver:ubuntu 14.04 64 位上缺少各种 lib 依赖项

    所以我尝试运行从下载的 chromedriver 2 20 wget http chromedriver storage googleapis com 2 20 chromedriver linux64 zip 在我的 ubuntu 14
  • 如何向 UILabel 添加填充? [复制]

    这个问题在这里已经有答案了 UILabel 内的文本与左边框和右边框相冲突 有没有办法向 UILabel 添加一些内部填充 以便文本不会如此紧密地接触内部边框 只需调整标签的位置 我不知道任何其他方法 尽管其他人可能会 如果您对背景颜色有疑
  • OpenXML:Excel 中自动调整列宽

    我已经编写了使用 OpenXML 生成 Excel 文件的代码 下面是在 Excel 中生成列的代码 Worksheet worksheet new Worksheet Columns columns new Columns int num