我目前正在努力研究MSDN网站上的OpenXML 2.5框架,https://msdn.microsoft.com/en-us/library/office/cc861607.aspx
我尝试将单元格添加到现有工作表的所有方法都会损坏工作簿,因为MSDN网站仅概述创建工作表而不修改它。
每次我添加一个单元格时,系统都需要一个全新的工作表,并且不允许在现有工作表中添加单元格。我一直在敲打MSDN并且谷歌搜索这个没有运气的几个小时。
问题是我需要一个可以接收字符串并更新excel文件的类。有没有人能够将单元格添加到现有工作表?我的问题似乎是由字符串解决方案引起的。
工作输入(PowerShell)仅在为Cell创建新的Worksheet时才有效
length
此指向的文件具有以下内容,
[CmdletBinding(SupportsShouldProcess=$true, ConfirmImpact='Medium')]
$cSharpData = (
[Reflection.Assembly]::LoadWithPartialName("DocumentFormat.OpenXml"),
[Reflection.Assembly]::LoadWithPartialName("WindowsBase"),
[Reflection.Assembly]::LoadWithPartialName("System.Linq")
)
[String]$cSharpClass = Get-Content .\method.cs
$cSharpType = Add-Type -ReferencedAssemblies $cSharpData -TypeDefinition $cSharpClass
$testData = Get-WmiObject Win32_QuickFixEngineering
[DoExcelMethod]::CreateXLSX('.\test.xlsx')
$locNo = 1
[DoExcelMethod]::AddSheetData('.\test.xlsx', $testData, 'TestWS', 'A', $locNo)
所以尽管有这个工作我无法将一个单元格放到现有的工作表中,任何人都可以帮忙,因为我疯了:(
全部谢谢
答案 0 :(得分:3)
您遇到的问题是InsertWorksheet
中AddSheetData
的来电。无论工作表是否已存在,您都在调用InsertWorksheet
方法。您可以先搜索工作表,然后再搜索工作表,然后再使用它,如果不存在,则可以创建新工作表。
首先,您可以使用此方法(取自我的回答here)按其名称搜索WorksheetPart
:
private static WorksheetPart GetWorksheetPartBySheetName(WorkbookPart workbookPart, string sheetName)
{
WorksheetPart worksheetPart = null;
//find the sheet (note this is case-sensitive)
IEnumerable<Sheet> sheets = workbookPart.Workbook.GetFirstChild<Sheets>().Elements<Sheet>().Where(s => s.Name == sheetName);
if (sheets.Count() > 0)
{
string relationshipId = sheets.First().Id.Value;
worksheetPart = (WorksheetPart)workbookPart.GetPartById(relationshipId);
}
return worksheetPart;
}
如果该方法找到WorksheetPart
,那么它将返回它,否则它将返回null
。
完成后,您需要对AddSheetData
进行一次小调整才能调用GetWorksheetPartBySheetName
,如果该方法返回InsertWorksheet
,则只需调用null
。为此,您可以替换此行
WorksheetPart wsPart = InsertWorksheet(wsName, sSheet.WorkbookPart);
用这个
WorksheetPart wsPart = GetWorksheetPartBySheetName(sSheet.WorkbookPart, wsName);
if (wsPart == null)
wsPart = InsertWorksheet(wsName, sSheet.WorkbookPart);