Question

I am trying to insert data to multiple sheets. For my excel, I have two sheets which are "charts" and "ChartData". I'm able to update the data in sheet2, chartdata sheet, but I'm unable to insert data to sheet1. Here is code which I have tried to insert data into excel sheets. Here data is coming from database.

           double ticks = DateTime.Now.Ticks;
         // MarketAnalysis ms = new MarketAnalysis();
         //ms.Marketanalysis();

        File.Copy(Srcpath, @"E:\Works\OpenXML\DownloadTemplates\ExcelGenerated" + ticks + ".xlsx", true);
         using (SpreadsheetDocument myworkbok = SpreadsheetDocument.Open(@"E:\Works\OpenXML\DownloadTemplates\ExcelGenerated" + ticks + ".xlsx", true))
         {
             //Acess the main workbook which contain all the references

            WorkbookPart workbookpart = myworkbok.WorkbookPart;
             //Get sheet by name
             Sheet sheet = workbookpart.Workbook.Descendants<Sheet>().Where(s => s.Name == "ChartData").FirstOrDefault();

            //Worksheet Part by ID
             WorksheetPart worksheetpart = workbookpart.GetPartById(sheet.Id) as WorksheetPart;

            //Sheet data contains all the data
             SheetData sheetdata = worksheetpart.Worksheet.GetFirstChild<SheetData>();
             DataSet ds = db.Chart1Data();

              for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
             {
                 //  if (ds.Tables[0].Rows !=DBNull)
                 //{

                string Rowlabel = ds.Tables[0].Rows[i][0].ToString();
                 // float? FY13Actuval = Convert.ToInt32(ds.Tables[0].Rows[i][1]);

                if (!string.IsNullOrEmpty(ds.Tables[0].Rows[i][1].ToString()))
                 {
                     // string s = ds.Tables[0].Rows[i][1].ToString();
                     //FY13Actuval=float.Parse(ds.Tables[0].Rows[i][1].ToString());

                    FY13Actuval = Convert.ToDouble(ds.Tables[0].Rows[i][1].ToString());
                 }
                 else
                 {

                    FY13Actuval = null;
                 }

                double? Budget = Convert.ToDouble(ds.Tables[0].Rows[i][2].ToString());
                 double? Actuval = Convert.ToDouble(ds.Tables[0].Rows[i][3].ToString());
                 Row contentrow = CreateContentRow(index, Product, Actual, Budget, Forecast);

                index++;
                 sheetdata.AppendChild(contentrow);

                // }
             }
 .......Same code for the other 3 charts
 Sheet sheet1 = workbookpart.Workbook.Descendants<Sheet>().Where(s => s.Name == "Charts").FirstOrDefault();

            WorksheetPart worksheetpart1 = workbookpart.GetPartById(sheet1.Id) as WorksheetPart;

            //Sheet data contains all the data
             SheetData sheetdata1 = worksheetpart1.Worksheet.GetFirstChild<SheetData>();

            DataSet dsTbl = db.Table();
             int SCMTblIndex=5;
             for (int i = 0; i < dsTbl.Tables[0].Rows.Count; i++)
             {
                 Row tblRow = CreateScorecardMetricTblRow(SCMTblIndex, dsTbl.Tables[0].Rows[i][0].ToString(),
                                                                    dsTbl.Tables[0].Rows[i][1].ToString(),
                                                                    dsTbl.Tables[0].Rows[i][2].ToString());
                 SCMTblIndex++;
                 sheetdata1.AppendChild(tblRow);
             }

                myworkbok.WorkbookPart.Workbook.Save();
         }

and the Methods to create the cells:

public static string[] headerColumns = new string[]{ "A", "B", "C", "D", "E", "F", "G", "I", "J" };
public static string[] header = new string[] { "D", "E", "F" };

private static Row CreateContentRow(int index, string Product, double? Actual, double? Budget, double? Forecast)
     {

        //Create New ROw
         Row r = new Row();
         r.RowIndex = (UInt32)index;


        //Begin colums
         Cell c0 = new Cell();
         c0.CellReference = headerColumns[0] + index;
         CellValue v0 = new CellValue();
         v0.Text = Product;
         c0.AppendChild(v0);
         r.AppendChild(c0);

        Cell c1 = new Cell();
         c1.CellReference = headerColumns[1] + index;
         CellValue v1 = new CellValue();
         v1.Text = Actual.ToString();
         c1.AppendChild(v1);
         r.AppendChild(c1);

        Cell c2 = new Cell();
         c2.CellReference = headerColumns[2] + index;
         CellValue v2 = new CellValue();
         v2.Text = Budget.ToString();
         c2.AppendChild(v2);
         r.AppendChild(c2);

        Cell c3 = new Cell();
         c3.CellReference = headerColumns[3] + index;
         CellValue v3 = new CellValue();
         v3.Text = Forecast.ToString();
         c3.AppendChild(v3);
         r.AppendChild(c3);


        return r;


    }
public static Row CreateScorecardMetricTblRow(int index, string Act_Data, string Bud_Data, string VarPr_Data)
     {
         Row r = new Row();
         r.RowIndex = (UInt32)index;
         //Begin Colums

        Cell c0 = new Cell();
         c0.CellReference = header[0] + index;
         CellValue v0 = new CellValue();
         v0.Text = Act_Data;
         c0.AppendChild(v0);
         r.AppendChild(c0);

        Cell c1 = new Cell();
         c1.CellReference = header[1] + index;
         CellValue v1 = new CellValue();
         v1.Text = Bud_Data;
         c1.AppendChild(v1);
         r.AppendChild(c1);

        Cell c2 = new Cell();
         c2.CellReference = header[2] + index;
         CellValue v2 = new CellValue();
         v2.Text = VarPr_Data;
         c2.AppendChild(v2);
         r.AppendChild(c2);
          return r;
     }
Was it helpful?

Solution

for multiple sheets to updated just

// Open the document for editing.
using (SpreadsheetDocument spreadSheet = SpreadsheetDocument.Open(docName, true)) 
{

   // Insert code here.

}

create a two classes for two sheets which you need to update sheet cell values.For each class constructor pass the SpreadsheetDocument object and implement insert text into a cell in a spreadsheet document.Just avoid the code for insertion of new sheet and try the insertion of the cell code only.

OTHER TIPS

You can try this method.....it may be helpful..

    private static Cell InsertCellInWorksheet(string columnName, int rowIndex, WorksheetPart worksheetPart)
    {
        Worksheet worksheet = worksheetPart.Worksheet;
        SheetData sheetData = worksheet.GetFirstChild<SheetData>();
        string cellReference = columnName + rowIndex;

        Alignment alignment1 = new Alignment() { WrapText = true };
        
        // If the worksheet does not contain a row with the specified row index, insert one.
        Row row;
        row = new Row() { RowIndex = 3, StyleIndex = 1 };
        if (sheetData.Elements<Row>().Where(r => r.RowIndex == rowIndex).Count() != 0)
        {
            row = sheetData.Elements<Row>().Where(r => r.RowIndex == rowIndex).First();
        }
        else
        {
            row = new Row() { RowIndex = Convert.ToUInt32(rowIndex) };
            sheetData.Append(row);
        }

        // If there is not a cell with the specified column name, insert one.  
        if (row.Elements<Cell>().Where(c => c.CellReference.Value == columnName + rowIndex).Count() > 0)
        {
            Row row2;
            row2 = new Row() { RowIndex = 3, StyleIndex = 1 };
            Cell rCell = null;
            foreach (Cell celld in row.Elements<Cell>())
            {
                if (string.Compare(celld.CellReference.Value, "A3", true) > 0)
                {
                    rCell = celld;
                    break;
                }
            }

            // Add the cell to the cell table at A1.
            Cell newCell = new Cell() { CellReference = "C3" };
            //Cell newCell1 = new Cell() { CellReference = "D3" };
            row.InsertBefore(newCell, rCell);
            //row.InsertBefore(newCell1, rCell);

            // Set the cell value to be a numeric value of 100.
            newCell.CellValue = new CellValue("#GUIDeXactLCMS#");
            //newCell1.CellValue = new CellValue("EN");
            newCell.DataType = new EnumValue<CellValues>(CellValues.Number);

            return row.Elements<Cell>().Where(c => c.CellReference.Value == cellReference).First();
        }
        else
        {
            // Cells must be in sequential order according to CellReference. Determine where to insert the new cell.
            Cell refCell = null;
            foreach (Cell cell in row.Elements<Cell>())
            {
                if (string.Compare(cell.CellReference.Value, cellReference, true) > 0)
                {
                    //string val = cell.CellReference.Value;
                    refCell = cell;
                    break;
                }
            }

            Cell newCell = new Cell() { CellReference = cellReference };
            row.InsertBefore(newCell, refCell);

            
            return newCell;
            
            
        }
        worksheet.Save();
    }
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top