使用EPPlus Excel - 如何忽略Excel错误检查或删除单元格左上角的绿色标记

13

我使用EPPlus来导出Excel 2007文件。文件可以正常导出,但是我在设置列格式方面遇到了一些问题。我的字符串列使用数字样式(采购订单号码例如49000001),每个单元格的左上角会带有绿色标签,我该如何去掉它?

我尝试将数字格式设置为“常规”,但没有起作用。

请帮忙解决这个问题。

p.s 我使用C#。


你可以在不修改EPPlus的情况下完成它 - 请参见https://stackoverflow.com/a/41349783/492 - CAD bloke
7个回答

17

EPPLus目前不支持禁用那个绿色标签。但是,可以修改项目以抑制它。首先,您需要向项目中添加一个新类ExcelIgnoredError.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;

namespace OfficeOpenXml
{
    public class ExcelIgnoredError : XmlHelper
    {
        private ExcelWorksheet _worksheet;

        /// <summary>
        /// Constructor
        /// </summary>
        internal ExcelIgnoredError(XmlNamespaceManager ns, XmlNode node, ExcelWorksheet xlWorkSheet) :
            base(ns, node)
        {
            _worksheet = xlWorkSheet;
        }


        public bool NumberStoredAsText
        {
            get
            {
                return GetXmlNodeBool("@numberStoredAsText");
            }
            set
            {
                SetXmlNodeBool("@numberStoredAsText", value);
            }
        }


        public bool TwoDigitTextYear
        {
            get
            {
                return GetXmlNodeBool("@twoDigitTextYear");
            }
            set
            {
                SetXmlNodeBool("@twoDigitTextYear", value);
            }
        }


        public string Range
        {
            get
            {
                return GetXmlNodeString("@sqref");
            }
            set
            {
                SetXmlNodeString("@sqref", value);
            }
        }
    }
}


接下来,您需要修改ExcelWorkSheet.cs,并添加此代码:

public ExcelIgnoredError _ignoredError;

public ExcelIgnoredError IgnoredError
{
    get
    {
        if (_ignoredError == null)
        {
            // Check that ignoredErrors exists
            XmlNode node = TopNode.SelectSingleNode("d:ignoredErrors", NameSpaceManager);

            if (node == null)
            {
                CreateNode("d:ignoredErrors");
            }

            //Check that ignoredError exists
            node = TopNode.SelectSingleNode("d:ignoredErrors/d:ignoredError", NameSpaceManager);

            if (node == null)
            {
                CreateNode("d:ignoredErrors/d:ignoredError");
                node = TopNode.SelectSingleNode("d:ignoredErrors/d:ignoredError", NameSpaceManager);
            }

            _ignoredError = new ExcelIgnoredError(NameSpaceManager, node, this);
        }

        return (_ignoredError);
    }
}


编译EPPPlus解决方案,将其包含在您的项目中,然后您就可以使用类似于以下代码的代码删除标签:

//Get a reference to the worksheet
ExcelWorkSheet sheet = package.WorkBook.WorkSheets(0);

//Set the cell range to ignore errors on to the whole sheet
sheet.IgnoredError.Range = Sheet.Dimension.Address;

//Do not display the warning 'number stored as text'
sheet.IgnoredError.NumberStoredAsText = true;

请注意,最后这几行应该是// 不显示警告“数字存储为文本”表。IgnoredError.NumberStoredAsText = True; 谢谢您的发布!非常有效! - user2029432
请注意,在此解决方法中设置范围非常重要。我对此粗心大意,导致打开工作簿时出现了 Excel 错误。 - Zoltán Tamási
1
@briddums 我没有编辑源代码的可能性,有没有一种“从外部”编辑XML的方法? - Loïc Wolff
@briddums 如果我使用您的代码,它只会抑制错误还是转换底层数据类型?因为当我们实施解决方案时,客户强制要求Excel数据可用,即可以像普通的Excel表格一样执行AVG、SUM等操作。先感谢您。 - user3328730

5
除了@briddums的回答之外,自EPPlus版本5开始,您可以忽略错误,无需触碰EPPlus源代码。
var p = new ExcelPackage();
var ws = p.Workbook.Worksheets.Add("IgnoreErrors");

ws.Cells["A1"].Value = "1";
ws.Cells["A2"].Value = "2";
var ie = ws.IgnoredErrors.Add(ws.Cells["A2"]);
ie.NumberStoredAsText = true;   // Ignore errors on A2 only

2
这段代码能正常运行。
private void removingGreenTagWarning(ExcelWorksheet template1, string address)
            {
                var xdoc = template1.WorksheetXml;
                //Create the import nodes (note the plural vs singular
                var ignoredErrors = xdoc.CreateNode(System.Xml.XmlNodeType.Element, "ignoredErrors", xdoc.DocumentElement.NamespaceURI);
                var ignoredError = xdoc.CreateNode(System.Xml.XmlNodeType.Element, "ignoredError", xdoc.DocumentElement.NamespaceURI);
                ignoredErrors.AppendChild(ignoredError);

                //Attributes for the INNER node
                var sqrefAtt = xdoc.CreateAttribute("sqref");
                sqrefAtt.Value = address;// 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);
            }

使用它作为

removingGreenTagWarning(template1, template1.Cells[1, 1, 100, 100].Address);

1

将采购订单号值转换为数字,然后存储在单元格中。每个单元格左上角的绿色标签是因为您将数字存储为字符串。


0

是的,EPPlus无法根据其值将数据视为数字。如果您的基础数据是字符串数据类型,则可以尝试将其转换为数值数据类型。例如,如果您从存储过程中获取数据,请尝试将其作为数值值获取。我们在实现它时遇到了一个问题。我们在Web和生成Excel时使用了相同的存储过程。Web UI需要将其作为字符串数据类型进行格式化,而EPPlus显然需要将其作为数值格式进行显示。解决方案是在使用C#代码中的EPPlus导出到Excel时将所需数据转换为数值。因此,您需要编写一个转换函数,将DataTable中的必需字段转换为所需的数据类型(或使用存储过程中的强制转换或转换逻辑来实现转换)。

总之:-编写一个C#函数,将您获得的DataTable中列的数据类型转换为使用EPPlus发送为Excel表格之前的数据类型。


-2
您可以使用
worksheet.Cell[1,1].Formula = "TEXT(" + cellvalue ")";

-2

我用更简单的方法解决了这个问题。例如,如果我将值“123”定义为对象而不是字符串,则可以成功地存储到Excel文件中。


3
不幸的是,将000123作为对象而不是字符串存储会在Excel文件中以123而非000123的形式显示。字符串对于保持文本格式很重要。 - briddums

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接