Hello,
An exception is thrown when importing an xlsx file which has a comment that does not have an author. But the author may be null.
System.ArgumentException: 'author' This exception was originally thrown at this call stack: Telerik.Windows.Documents.Spreadsheet.Utilities.Guard.ThrowExceptionIfNullOrEmpty(string, string) Telerik.Windows.Documents.Spreadsheet.Model.NoteCollection.Add(Telerik.Windows.Documents.Spreadsheet.Model.CellIndex, Telerik.Windows.Documents.Spreadsheet.Model.CellIndex, string, string) Telerik.Windows.Documents.Spreadsheet.FormatProviders.OpenXml.Xlsx.Contexts.XlsxWorksheetImportContext.ApplyNoteInfo(Telerik.Windows.Documents.Spreadsheet.FormatProviders.OpenXml.Xlsx.Contexts.NoteBase) Telerik.Windows.Documents.Spreadsheet.FormatProviders.OpenXml.Xlsx.Model.Elements.Comments.CommentElement.OnAfterRead(Telerik.Windows.Documents.Spreadsheet.FormatProviders.OpenXml.Xlsx.Import.IXlsxWorksheetImportContext) Telerik.Windows.Documents.Spreadsheet.FormatProviders.OpenXml.Xlsx.Model.Elements.Comments.CommentsElementBase.OnAfterRead(Telerik.Windows.Documents.Spreadsheet.FormatProviders.OpenXml.Xlsx.Import.IXlsxWorkbookImportContext) Telerik.Windows.Documents.FormatProviders.OpenXml.Model.Elements.OpenXmlElementBase<TImportContext, TExportContext, TPartsManager>.OnAfterRead(Telerik.Windows.Documents.FormatProviders.OpenXml.Import.IOpenXmlImportContext) Telerik.Windows.Documents.FormatProviders.OpenXml.Model.Elements.OpenXmlElementBase.Read(Telerik.Windows.Documents.FormatProviders.OpenXml.IOpenXmlReader, Telerik.Windows.Documents.FormatProviders.OpenXml.Import.IOpenXmlImportContext) Telerik.Windows.Documents.FormatProviders.OpenXml.Model.Elements.OpenXmlElementBase.ReadChildElements(Telerik.Windows.Documents.FormatProviders.OpenXml.IOpenXmlReader, Telerik.Windows.Documents.FormatProviders.OpenXml.Import.IOpenXmlImportContext) Telerik.Windows.Documents.FormatProviders.OpenXml.Model.Elements.OpenXmlElementBase.Read(Telerik.Windows.Documents.FormatProviders.OpenXml.IOpenXmlReader, Telerik.Windows.Documents.FormatProviders.OpenXml.Import.IOpenXmlImportContext) Telerik.Windows.Documents.FormatProviders.OpenXml.Model.Elements.OpenXmlElementBase.ReadChildElements(Telerik.Windows.Documents.FormatProviders.OpenXml.IOpenXmlReader, Telerik.Windows.Documents.FormatProviders.OpenXml.Import.IOpenXmlImportContext) ... [Call Stack Truncated]
This is the code that can be used to reproduce the issue, according to your documentation:
Workbook workbook;
XlsxFormatProvider formatProvider = new XlsxFormatProvider();
using (Stream input = new FileStream(_path, FileMode.Open))
{
workbook = formatProvider.Import(input);
}
I have attached a document that got a comment without an author.
The values applied to the row/column should be explicitly set on each used cell as well. Otherwise, if they are applied on row/column only, the used cells don't use the desired values when opening the document.
To reproduce:
Observed: All cells except A1 have the specified color.
Workaround: Use cell selection, e.g.:
sheet.Cells[0,10].SetFill(PatternFill.CreateSolidFill(Colors.Red));
For example:
Renaming a sheet named "Sheet1" to "Sheet 1", should update formulas references to it to 'Sheet 1!' (notice single quotes), which it does not. The formula =SUM(Sheet1!A2:C2) changes to the invalid expression =SUM(Sheet 1!A2:C2). This breaks formulas referencing that sheet.
Workaround:
Iterate all cells with formulas in the workbook and add single quotes to the beginning and end of sheet name reference. The attached project changes the name of Sheet1 and then fixes all formula references to it by enclosing its name in single quotes.
Currently, similar conversions should be manually implemented by the users.
Sample method that could be used:
public static Color HexStringToColor(string hexColor)
{
// Remove the # at the front.
if (hexColor.StartsWith("#"))
{
hexColor = hexColor.Substring(1, hexColor.Length - 1);
}
byte a = 255;
byte r = 255;
byte g = 255;
byte b = 255;
int start = 0;
// Handle ARGB strings (8 characters long).
if (hexColor.Length == 8)
{
start = 2;
}
//Handle contracted RGB strings (3 characters long)
if (hexColor.Length == 3)
{
hexColor = string.Format("{0}{0}{1}{1}{2}{2}", hexColor[0], hexColor[1], hexColor[2]);
}
else if (hexColor.Length < 6)
{
hexColor = hexColor.PadLeft(6, '0');
}
// Convert RGB characters to bytes.
r = byte.Parse(hexColor.Substring(start, 2), NumberStyles.HexNumber);
g = byte.Parse(hexColor.Substring(start + 2, 2), NumberStyles.HexNumber);
b = byte.Parse(hexColor.Substring(start + 4, 2), NumberStyles.HexNumber);
return Color.FromArgb(a, r, g, b);
}
Currently, the following text filters are not supported in the model: