简体   繁体   English

在openXML中添加Cell和Row

[英]Add Cell and Row in openXML

I have pre define excel format i need to pass the data to excel.I'm able to get the particular sheet .But don't know how to pass the data to cell. 我已经预先定义了excel格式我需要将数据传递给excel。我能够得到特定的表。但是不知道如何将数据传递给单元格。

var excelDocument = new ExcelDocument();
var fileName = Guid.NewGuid();
string filePath = HttpContext.Current.Server.MapPath("~/Uploads/TemplateFiles/test.xlsx");

using (SpreadsheetDocument document =
       SpreadsheetDocument.Open(filePath, false))
{
       WorkbookPart workbookPart = document.WorkbookPart;
       Workbook workbook = document.WorkbookPart.Workbook;
       string sheetName = workbookPart.Workbook.Descendants<Sheet>().ElementAt(1).Name;
       IEnumerable<Sheet> sheets = document.WorkbookPart.Workbook.Descendants<Sheet>().Where(s => s.Name == "Census Template for Import");
       if (sheets.Count() == 0)
       {
              // The specified worksheet does not exist.
              return null;
       }
       WorksheetPart worksheetPart = (WorksheetPart)document.WorkbookPart.GetPartById(sheets.First().Id);
       SheetData sheetData = worksheetPart.Worksheet.GetFirstChild<SheetData>();
       var excelRows = sheetData.Descendants<DocumentFormat.OpenXml.Spreadsheet.Row>().ToList();
       int rowindex = 10;
       foreach (var item in census)
       {
              //how to write the data in cell
              rowindex++;
       }

       worksheetPart.Worksheet.Save();
       workbookPart.Workbook.Save();
       document.Close();
       //worksheetPart.Worksheet.Save();
 }
 return filePath;

Can't tell if its a new file your creating or appending into an existing one but: 无法判断您的新文件是创建还是追加到现有文件中,但是:

 spreadSheet.WorkbookPart.WorksheetParts.First().Worksheet.First().AppendChild(new Row());
 sheet.First().Last().AppendChild(new Cell() { CellValue = new CellValue("test") });

Should work for both cases but the new cell will be put on the last active row in the first sheet. 应该适用于两种情况,但新单元格将放在第一张表格中的最后一个活动行。

Here is a method for getting a cell or adding a new one, if the cell does not exists, when you know both the row and column indexes. 当您知道行索引和列索引时,如果单元格不存在,这是获取单元格或添加新单元格的方法。

Note that: 注意:

  • rowIndex and columnIndex should start with 1 rowIndex和columnIndex应该以1开头
  • property RowIndex of a Row should be initialized during the creation of the row 财产RowIndex一个的Row应该在创建行期间被初始化
  • property CellReference of a Cell should be initialized during the creation of the cell 属性CellReference应该在创建单元期间初始化Cell

If RowIndex or CellReference is null, then NullReferenceException will be thrown. 如果RowIndexCellReference为null,则抛出NullReferenceException。

private Cell InsertCell(uint rowIndex, uint columnIndex, Worksheet worksheet)
{
    Row row = null;
    var sheetData = worksheet.GetFirstChild<SheetData>();

    // Check if the worksheet contains a row with the specified row index.
    row = sheetData.Elements<Row>().FirstOrDefault(r => r.RowIndex == rowIndex);
    if (row == null)
    {
        row = new Row() { RowIndex = rowIndex };
        sheetData.Append(row);
    }

    // Convert column index to column name for cell reference.
    var columnName = GetExcelColumnName(columnIndex);
    var cellReference = columnName + rowIndex;      // e.g. A1

    // Check if the row contains a cell with the specified column name.
    var cell = row.Elements<Cell>()
               .FirstOrDefault(c => c.CellReference.Value == cellReference);
    if (cell == null)
    {
        cell = new Cell() { CellReference = cellReference };
        if (row.ChildElements.Count < columnIndex)
            row.AppendChild(cell);
        else
            row.InsertAt(cell, (int)columnIndex);
    }

    return cell;
}

Here you will find the code of GetExcelColumnName() method. 在这里,您将找到GetExcelColumnName()方法的代码。

I had the same issue that you had and this article How to: Insert text into a cell in a spreadsheet document (Open XML SDK) . 我有同样的问题和本文如何:将文本插入电子表格文档中的单元格(Open XML SDK) I guess you need to insert a new Cell object into your worksheet and then insert the specified data (assuming it is a string or that it has already being cast into a string) into that cell. 我想你需要在你的工作表中插入一个新的Cell对象,然后将指定的数据(假设它是一个字符串或者它已经被强制转换为字符串)插入到该单元格中。

Seems you define rowindex=10, there are two way to add rows. 似乎你定义了rowindex = 10,有两种方法可以添加行。 If row 10 is last row in your excel then you can simply append new row like: 如果第10行是excel中的最后一行,那么您可以简单地添加新行,如:

foreach (var item in census)
       {
              //how to write the data in cell
              Row row = new Row(); 
              row.RowIndex = (UInt32)rowindex;
              Cell cell = new Cell()  
              {  

                DataType = CellValues.String,  
                CellValue = new CellValue("value")  
              };
              row.Append(cell);
              sheetData.Append(row);
              rowindex++;
       }

If there are rows after row 10 then you have to use insert,then manually change rows and cells after row 10 index to the right index value like: 如果第10行之后有行,则必须使用insert,然后手动将第10行索引后的行和单元格更改为正确的索引值,如:

    foreach (var item in census)
               {
                //how to write the data in cell
                Row refRow = GetRow(sheetData, rowIndex);
                ++rowIndex;

                Cell cell1 = new Cell() { CellReference = "A" + rowIndex };
                CellValue cellValue1 = new CellValue();
                cellValue1.Text = "";
                cell1.Append(cellValue1);
                Row newRow = new Row()
                {
                    RowIndex = rowIndex
                };
                newRow.Append(cell1);
                for (int i = (int)rowIndex; i <= sheetData.Elements<Row>().Count(); i++)
                {
                    var row = sheetData.Elements<Row>().Where(r => r.RowIndex.Value == i).FirstOrDefault();
                    row.RowIndex++;
                    foreach (Cell c in row.Elements<Cell>())
                    {
                        string refer = c.CellReference.Value;
                        int num = Convert.ToInt32(Regex.Replace(refer, @"[^\d]*", ""));
                        num++;
                        string letters = Regex.Replace(refer, @"[^A-Z]*", "");
                        c.CellReference.Value = letters + num;
                    }
                }
                sheetData.InsertAfter(newRow, refRow);
                      rowindex++;
               }
static Row GetRow(SheetData wsData, UInt32 rowIndex)
    {
        var row = wsData.Elements<Row>().
        Where(r => r.RowIndex.Value == rowIndex).FirstOrDefault();
        if (row == null)
        {
            row = new Row();
            row.RowIndex = rowIndex;
            wsData.Append(row);
        }
        return row;
    }

This is a prototype. 这是一个原型。 You might need to change some code or variable name to fit your project. 您可能需要更改某些代码或变量名称以适合您的项目。

References: 参考文献:

append rows in Excel by OpenXML 通过OpenXML在Excel中追加行

insert rows in Excel by OpenXML 通过OpenXML在Excel中插入行

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM