我已经有一段时间在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。
有什么想法吗?
答案 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个不同的值,但它对我来说是一个有用的解决方法!