OpenXML将单元格添加到工作表

时间:2016-07-05 02:09:45

标签: c# excel powershell openxml worksheet

我目前正在努力研究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)

所以尽管有这个工作我无法将一个单元格放到现有的工作表中,任何人都可以帮忙,因为我疯了:(

全部谢谢

1 个答案:

答案 0 :(得分:3)

您遇到的问题是InsertWorksheetAddSheetData的来电。无论工作表是否已存在,您都在调用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);