Tag: openxml

如何使用OpenXmlWriterconfigurationxlsx格式和公式

我需要创build大的通用xlsx报告(超过500k行~50列)。 我写了生成这个报告的方法,但是我不知道如何设置单元格的格式(数据格式/样式(边框等))以及如何把公式放到使用OpenXmlWriter的单元格中。 private void FillExcelWorksheet<T>(String fileName, IEnumerable<T> source) { var properties = typeof(T).GetProperties(); using (SpreadsheetDocument document = SpreadsheetDocument.Create(fileName, SpreadsheetDocumentType.Workbook)) { //this list of attributes will be used when writing a start element List<OpenXmlAttribute> stringAttributes = new List<OpenXmlAttribute>() { new OpenXmlAttribute("t", null, "str") }; OpenXmlWriter writer; var workBookPart = document.AddWorkbookPart(); var workSheetPart = workBookPart.AddNewPart<WorksheetPart>(); writer = […]

DocumentFormat.OpenXml.dll中发生types“System.OutOfMemoryException”的exception

我必须在excel中存储大约315k行数据,每行15列,并使其可供下载。 我正在检索所有数据,然后将其存储在数据表中,然后使用OpenXml将其写入工作簿并发送响应。 但是由于数据量巨大,我得到一个exceptionSystem.OutOfMemoryExceptionexception。 当我通过检索大约100klogging来尝试它时,整个工作正常,没有任何错误。 我在这里看到过类似的问题,但它是用FileStream ,因此MemoryStream的大小是dynamic设置的 MemoryStream memory = new MemoryStream(fileStream.size()) 我想知道是否有办法用DataTable来做到这一点。 我相信更新excel工作表逐行将是一个选项,但将包括检查数据types等的很多代码。 另外,通过与“File being corrupt”的合作,我遇到了很多问题。 因此,我更喜欢一个xlsx文件。 protected void DownloadDetailTable_OnClick(object sender, EventArgs e) { string value = ddl_AuditEnvironment.SelectedValue; String connectionString = ConfigurationManager.ConnectionStrings["stagingConnection"].ConnectionString; // DataTable that stores the result set to be written on an excel. DataTable dataTableObj = GetAuditData.GetDetailsTable(value, connectionString); string attachment = "attachment; filename=Summary.xlsx"; […]

如何区分date和其他数字格式(如数字/货币)在打开xml sdk SpreadSheet?

我正在阅读使用OpenXML SDK的xlsx文件。 阅读共享string值没有问题,但我不知道如何区分实际的数字和date,因为他们都有DataType为null,他们被存储为数字。 使用DateTime.FromOADate()我可以将数字值转换为date格式,但首先我需要确定单元格格式是否是date,否则数/货币格式的单元格值也将转换为date。 我试过在这篇文章中提到的解决scheme如何区分在OpenXML SpreadSheet中的OLE自动化date编号的内嵌数字? 。 但它不适用于货币格式,数字格式(负数格式请参阅附件截图)和一些自定义格式的数字和货币格式的截图。它将货币和数字格式转换为date 我在寻找 通用的解决scheme区分date和所有其他数字格式,以便格式(如数字,货币,科学)和自定义格式的数值的所有生成不会被转换为date 有没有通用的方式来格式单元格值的格式应用在Excel表单。现在我们正在处理每个格式单独

OpenXML电子表格逗号分隔数字给出内容错误

我正在C#webrform项目中使用OpenXML创buildExcel文档。 在一个单元中,我input一个ID,在某些情况下,多个ID用逗号分隔,类似于: **ID1** **ID2** 10756409 3090,3093,3130 10776516 3105 10806938 3123 10817453 3090,3093,3100 在两列中的每个单元格都给出了CellValues.String数据types。 当我打开电子表格时,出现“发现内容有问题,请问我们要恢复…”警告。 当我点击是,数据是好的,但CSV值单元格保持正确(而不是右alignment的非CSV值)有绿色的angular落,说这个单元格中的数字被格式化为文本或之前一个撇号 。 如何在没有警告的情况下打开Excel?

检测何时使用密码打开或closuresExcel工作簿

我需要从VBA本身修改Excel工作簿,用户将指出要修改哪个工作簿,之后将修改工作簿的副本并以新名称保存。 这可以是已经打开的工作簿,也可以是磁盘上的已closures工作簿,我需要支持从2000年以后的所有工作簿types(2000-2016,二进制,加载项,模板等)。 我需要修改工作簿的内容以及其中的任何自定义UI(function区xml)。 这一切都必须从不受我控制的随机Excel安装完成。 我面临的问题是处理密码保护的工作簿 – encryption的,即打开密码。 我的代码需要能够处理这些,并最好将所使用的密码应用于保存的更新副本。 代码stream程如下: 让用户select工作簿进行修改(通过表单) 如果工作簿已打开: 保存到一个临时文件夹 指向保存的副本进行进一步处理 在Excel的第二个实例中打开用户select的文件(不可见) 更新打开的临时副本的内容 保存为没有密码的临时文件夹并closures它 更新已closures的临时副本的自定义UI 重新打开更新后的临时副本,并再次使用原始工作簿上的任何密码进行保存 使用上述步骤2.1,.SaveCopyAs将保存打开的工作簿并将任何密码应用于副本,这将导致步骤3中的所有情况都要求input密码。 我不能通过使用.SaveAs来删除步骤2.1中的通行证,因为这将导致打开的工作簿不再被打开。 这也只是一个半angular度的措施,因为它并不能阻止封闭文件发生的同样的事情。 在这种情况下,当Excel要求用户input密码(至less在Excel 2010中)时,密码提示只显示带有编辑框的文件的文件名,所有文件都在popup的第二个Excel窗口中开放,这是一个难看的景象。 而且它也不允许我捕捉input的密码以及第7步。 我能做的最好的办法就是检测磁盘上的一个closures的工作簿是否被encryption,然后显示自己的密码提示,然后再尝试打开它。 但如何做到这一点? 这些是我可以提出的选项; 当我使用Workbooks.Open(Filename:=…) ,然后Excel显示密码提示,我喜欢通过事先要求任何通过回避。 当我使用Workbooks.Open(Filename:=…, Password:="notthepassword") ,至lessExcel不会再显示密码提示,没有密码的工作簿可以正常打开,而那些使用pass的人现在会生成错误1004 。但是,我不能这样做推断密码是必要的,因为1004是Excel的全部错误号,我不能检查Err.Description要么是“错误的密码”等,因为我不知道在客户端上运行的Excel GUI语言。 然后检查Excel文件是否受密码保护 ; 当encryption的文件也有工作簿结构保护时,显然Excel不会再以这种方式打开它们 – 我testing了这个,它可以和我的2010 Excel一起工作,但听起来并不令人鼓舞。 忽略要求通过的Excel的丑陋,事后阅读任何Workbook.PasswordXxx属性不会透露任何东西; 他们总是返回相同的值在所有情况下(在工作簿上有或没有密码)。 对于OOXML文件(.xlsm / .xlsx等),我可以预先检查文件的zip内容是否存在两个文件“EncryptionInfo”和“EncryptedPackage”,表示文件已encryption,但2000-2003(.xls )文件? 在这些文件中使用了BIFF文件结构的Microsoft文档 ,告诉它检查工作簿stream中的FilePasslogging; 虽然我知道我可以实现这个逻辑(例如,现在不支持的Koogra项目 ),我宁愿不只是:)( 侧面的问题:从什么时候微软发布这些细节,而不签署NDA的,并跳过他们的合法的篮球? ) 有没有人有任何的洞察力,我可以如何做代码第7步。上面的工作,短短的生活与Excel的提示,并添加一个键logging器到我的应用程序? 🙂

办公室打开excel设置单个decimla的百分比的地方

我正在使用OPENXML来创buildExcel文档,我想显示百分比单个小数位的百分比格式,如“85.5%”。 我无法find任何适当的解决scheme。 以下是我创build样式表的function。 private Stylesheet GenerateStyleSheet(NumberingFormat nf2decimal) { return new Stylesheet( new Fonts( new Font(new FontSize() { Val = 11 }, new Color() { Rgb = new HexBinaryValue() { Value = "000000" } }, new FontName() { Val = "Calibri" }), new Font(new Bold(), new FontSize() { Val = 12 }, new Color() { Rgb […]

使用OpenXml中的SpreadsheetDocument更改.xlsx文档中的“标记”

在validation过程中,xlsx文件被转换为pdf。 在这个xlsx文件里面有一些“令牌”,它们需要用正确的值来覆盖。 要做到这一点,我使用这个: byte[] fileContent = document.Contents; using (MemoryStream mem = new MemoryStream()) { mem.Write(fileContent, 0, (int)fileContent.Length); OverrideXLSX(mem, document); } private static byte[] OverrideXLSX(MemoryStream mem, Document document) { byte[] toReturn; using(SpreadsheetDocument sprDoc = SpreadsheetDocument.Open(mem, true)) { foreach(WorksheetPart worksheetPart in sprDoc.WorkbookPart.WorksheetParts) { OverridXmlPart(worksheetPart, document); } mem.Position = 0; toReturn = mem.ToArray(); } return toReturn; } private […]

如何用open XML检索excel的文化信息?

我的Excel文件中的数值存储为“。” 十进制分隔符。 我想知道,excel总是使用“。” 作为十进制分隔符? 如果不是的话,那我该如何检索excel文件的文件信息来正确地格式化十进制值呢? 谢谢。

Open XML SDK向Excel单元格写入Double Value

我将数据从SQL数据库传输到ExcelSheet。 我可以写string和整数没有问题,但是当我写双打Excel需要修复文档。 它说,数字是作为文本格式。 我使用这个代码: double val = Math.Round(reader.GetDouble(3),2); cell.CellValue= new CellValue(Convert.ToString(val)); cell.DataType = new EnumValue<CellValues>(CellValues.Number);

将图片和评论添加到单元格导致问题

我正在使用下面的代码添加评论: ws.Cell("A5").Comment.SetVisible().AddText("sample"); ws.PageSetup.SetShowComments(XLShowCommentsValues.AsDisplayed); 当我注释掉下面的代码,它将一个图像添加到Excel文档中,然后评论的作品。 但是这个代码没有注释,会出现下面的错误: XLPicture pic = new XLPicture { NoChangeAspect = true, NoMove = true, NoResize = true, ImageStream = memo, Name = "Export Image", PaddingX = 12, PaddingY = 18 }; XLMarker fMark = new XLMarker { ColumnId = 1, RowId = 1 }; pic.AddMarker(fMark); workSheet.AddPicture(pic); 错误是: