1

我已经让 EPPlus(Office Open XML)在 Azure Web 角色上工作了一段时间,但我最近一直在尝试使用 Azure 网站,但我遇到了一个非常奇怪的错误;

[DivideByZeroException: Attempted to divide by zero.]
   System.Decimal.FCallDivide(Decimal& d1, Decimal& d2) +0
   OfficeOpenXml.Drawing.ExcelDrawing.SetPixelWidth(Int32 pixels, Single dpi) +465
   Compliance.Net.CommonCode.PivotGenerator.GeneratePivotTable(ExcelWorksheet dataWorksheet, ExcelWorksheet pivotWorksheet, Int32 endRow)

我在 Azure Web Role 上运行的相同数据和代码上得到了这个。

编辑: 违规行如下所示:

 var chart = pivotWorksheet.Drawings.AddChart("PivotChart", eChartType.ColumnClustered, pivotTable);
 chart.SetPosition(endRow + 2, 20, 1, 10);
 chart.SetSize(600, 400);

请注意,我已确保“endRow”> 1。

有任何想法吗?

4

1 回答 1

2

我自己也遇到了同样的问题,我已经提取了 EPPlus 源并进行了一些调查。

问题出在 ExcelWorkbook.cs 第 283 行,它调用

System.Windows.Forms.TextRenderer.MeasureText(字符串,字体).Width

这似乎在 Azure 网站中返回零。

我刚刚添加了一行

if (_standardFontWidth == 0) _standardFontWidth = 7;

(7 是我在本地获得的值,因此它将作为我的默认值 - 您的里程可能会有所不同)意味着我最终得到

    public decimal MaxFontWidth 
    {
        get
        {
            if (_standardFontWidth == decimal.MinValue)
            {
                var font = Styles.Fonts[0];
                System.Drawing.Font f = new System.Drawing.Font(font.Name, font.Size);
                _standardFontWidth=(decimal)(System.Windows.Forms.TextRenderer.MeasureText("00", f).Width - System.Windows.Forms.TextRenderer.MeasureText("0", f).Width);
            }
            if (_standardFontWidth == 0) _standardFontWidth = 7;
            return _standardFontWidth;
        }
    }

当然,这意味着从源代码构建 EPPlus,你可能对 7 有不同的值,但它对我来说是一个有用的解决方法!

于 2012-09-18T09:17:17.047 回答