我使用EPPlus来导出Excel 2007文件。文件可以正常导出,但是我在设置列格式方面遇到了一些问题。我的字符串列使用数字样式(采购订单号码例如49000001),每个单元格的左上角会带有绿色标签,我该如何去掉它?
我尝试将数字格式设置为“常规”,但没有起作用。
请帮忙解决这个问题。
p.s 我使用C#。
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;
谢谢您的发布!非常有效! - user2029432var 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
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);
将采购订单号值转换为数字,然后存储在单元格中。每个单元格左上角的绿色标签是因为您将数字存储为字符串。
是的,EPPlus无法根据其值将数据视为数字。如果您的基础数据是字符串数据类型,则可以尝试将其转换为数值数据类型。例如,如果您从存储过程中获取数据,请尝试将其作为数值值获取。我们在实现它时遇到了一个问题。我们在Web和生成Excel时使用了相同的存储过程。Web UI需要将其作为字符串数据类型进行格式化,而EPPlus显然需要将其作为数值格式进行显示。解决方案是在使用C#代码中的EPPlus导出到Excel时将所需数据转换为数值。因此,您需要编写一个转换函数,将DataTable中的必需字段转换为所需的数据类型(或使用存储过程中的强制转换或转换逻辑来实现转换)。
总之:-编写一个C#函数,将您获得的DataTable中列的数据类型转换为使用EPPlus发送为Excel表格之前的数据类型。
worksheet.Cell[1,1].Formula = "TEXT(" + cellvalue ")";
我用更简单的方法解决了这个问题。例如,如果我将值“123”定义为对象而不是字符串,则可以成功地存储到Excel文件中。