为什么我在Azure网站上获得Divide By Zero Exception?

时间:2012-09-07 07:05:10

标签: azure-web-roles epplus azure-web-sites

我已经有一段时间在Azure Web角色上使用EPPlus(Office Open XML),但我最近一直在尝试使用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角色上运行的数据和代码相同的数据和代码上获得此信息。

编辑: 违规行看起来像这样:

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

请注意,我确保'endRow'是> 1。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

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

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

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

似乎在Azure网站中返回Zero。

我刚刚添加了一行

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个不同的值,但它对我来说是一个有用的解决方法!