如何在EPPlus中关闭Excel应用程序对象的后台错误检查?

时间:2016-12-26 18:27:56

标签: excel background epplus error-checking

使用笨重且功能强大但功能齐全的Excel Interop,可以像这样切换背景错误检查:

Excel.Application excelApp = new Excel.Application();
excelApp.ErrorCheckingOptions.BackgroundChecking = false;

...如图所示here

我得到的绿色三角形表示一个错误的数字,如下所示:

enter image description here

...我想关掉它。这些只是字符串值,不应被标记为坏或可疑。

那么如何使用EPPlus关闭Excel应用程序对象的背景错误检查,或以其他方式以编程方式阻止这些绿色三角形?

更新

更改代码:

using (var custNumCell = priceComplianceWorksheet.Cells[rowToPopulate, DETAIL_CUSTNUM_COL])
{
    custNumCell.Style.Font.Size = DATA_FONT_SIZE;
    custNumCell.Value = _custNumber;
    custNumCell.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
}

......对此:

using (var custNumCell = priceComplianceWorksheet.Cells[rowToPopulate, DETAIL_CUSTNUM_COL])
{
    custNumCell.Style.Font.Size = DATA_FONT_SIZE;
    custNumCell.ConvertValueToAppropriateTypeAndAssign(_custNumber);
    custNumCell.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
}

// Adapted from https://stackoverflow.com/questions/26483496/is-it-possible-to-ignore-excel-warnings-when-generating-spreadsheets-using-epplu
public static void ConvertValueToAppropriateTypeAndAssign(this ExcelRangeBase range, object value)
{
    string strVal = value.ToString();
    if (!String.IsNullOrEmpty(strVal))
    {
        decimal decVal;
        double dVal;
        int iVal;

        if (decimal.TryParse(strVal, out decVal))
        {
            range.Value = decVal;
        }
        else if (double.TryParse(strVal, out dVal))
        {
            range.Value = dVal;
        }
        else if (Int32.TryParse(strVal, out iVal))
        {
            range.Value = iVal;
        }
        else
        {
            range.Value = strVal;
        }
    }
    else
    {
        range.Value = null;
    }
}

......半固定它;现在是:

enter image description here

但请注意领先" 0"被剥夺了。我需要留下来,所以这仍然只有一半解决了。

更新2

我尝试了下面评论中指出here的建议,并添加了以下代码:

    //Create the import nodes (note the plural vs singular
    var ignoredErrors = 
priceComplianceWorksheet.CreateNode(XmlNodeType.Element, "ignoredErrors",
xdoc.DocumentElement.NamespaceURI);
    var ignoredError
priceComplianceWorksheet.CreateNode(XmlNodeType.Element, "ignoredError",
xdoc.DocumentElement.NamespaceURI);
    ignoredErrors.AppendChild(ignoredError);

    //Attributes for the INNER node
    var sqrefAtt = priceComplianceWorksheet.CreateAttribute("sqref");
    sqrefAtt.Value = range;

    var flagAtt =
priceComplianceWorksheet.CreateAttribute("numberStoredAsText");
    flagAtt.Value = "1";

    ignoredError.Attributes.Append(sqrefAtt);
    ignoredError.Attributes.Append(flagAtt);

    //Now put the OUTER node into the worksheet xml
   priceComplianceWorksheet.LastChild.AppendChild(ignoredErrors);

...但是" CreateAttribute"和#34; LastChild"不被承认......?!?

1 个答案:

答案 0 :(得分:1)

为了响应更新2,您只需要引用XmlDocument并使用它来生成XML:

var xdoc = priceComplianceWorksheet.WorksheetXml;

//Create the import nodes (note the plural vs singular
var ignoredErrors = xdoc.CreateNode(XmlNodeType.Element, "ignoredErrors",xdoc.DocumentElement.NamespaceURI);
var ignoredError = xdoc.CreateNode(XmlNodeType.Element, "ignoredError",xdoc.DocumentElement.NamespaceURI);
ignoredErrors.AppendChild(ignoredError);

//Attributes for the INNER node
var sqrefAtt = xdoc.CreateAttribute("sqref");
sqrefAtt.Value = "C2:C10"; // Or whatever range is needed....

var flagAtt = xdoc.CreateAttribute("numberStoredAsText");
flagAtt.Value = "1";

ignoredError.Attributes.Append(sqrefAtt);
ignoredError.Attributes.Append(flagAtt);

//Now put the OUTER node into the worksheet xml
xdoc.LastChild.AppendChild(ignoredErrors);