Forum Discussion

MarcusH's avatar
MarcusH
Contributor III
2 years ago

Create Excel spreadsheet from Business Rules

Does anyone know if you can create an Excel spreadsheet from Business Rules? I do not mean a csv file - I need to create multiple sheets. The OpenXMLBuilder object doesn't seem to have anything with writing files. I don't want to use a third-party object as that would require an installation or download.

Thanks for any suggestions.

  • You can use this function it takes a data table as parameter and generates an excel file I don't know what your exact requirements are but this can be a good starting point and you can modify it further.

    Imports System
    Imports DocumentFormat.OpenXml
    Imports DocumentFormat.OpenXml.Packaging
    Imports DocumentFormat.OpenXml.Spreadsheet
    
    Public Sub CreateExcelFileFromDataTable(dataTable As DataTable)
    	'Create a new Excel file
    	Dim filePath As String = "C:\example.xlsx"
    	'Create the SpreadsheetDocument object and set its type to Workbook
    	Using document As SpreadsheetDocument = SpreadsheetDocument.Create(filePath, SpreadsheetDocumentType.Workbook)
    		'Create the workbook
    		Dim workbookPart As WorkbookPart = document.AddWorkbookPart()
    		workbookPart.Workbook = New Workbook()
    		'Create the worksheet
    		Dim worksheetPart As WorksheetPart = workbookPart.AddNewPart(Of WorksheetPart)()
    		worksheetPart.Worksheet = New Worksheet()
    		'Create the sheet data
    		Dim sheetData As SheetData = worksheetPart.Worksheet.AppendChild(New SheetData())
    		'Create the header row
    		Dim headerRow As Row = New Row()
    		'Loop through each column in the DataTable and add it to the header row
    		For Each column As DataColumn In dataTable.Columns
    			headerRow.AppendChild(New Cell() With {.DataType = CellValues.String, .CellValue = New CellValue(column.ColumnName)})
    		Next
    
    		'Add the header row to the sheet data
    		sheetData.AppendChild(headerRow)
    		'Populate the data rows
    		For Each dataRow As DataRow In dataTable.Rows
    			Dim row As Row = New Row()
    			'Loop through each column in the DataTable and add the corresponding cell value to the current row
    			For Each column As DataColumn In dataTable.Columns
    				row.AppendChild(New Cell() With {.DataType = CellValues.String, .CellValue = New CellValue(dataRow(column.ColumnName).ToString())})
    			Next
    
    			'Add the row to the sheet data
    			sheetData.AppendChild(row)
    		Next
    
    		'Create the sheets
    		Dim sheets As Sheets = workbookPart.Workbook.AppendChild(New Sheets())
    		Dim sheet As Sheet = New Sheet() With {.Id = workbookPart.GetIdOfPart(worksheetPart), .SheetId = 1, .Name = "Sheet1"}
    		sheets.Append(sheet)
    		'Save changes
    		workbookPart.Workbook.Save()
    	End Using
    End Sub
    

     

  • You can use this function it takes a data table as parameter and generates an excel file I don't know what your exact requirements are but this can be a good starting point and you can modify it further.

    Imports System
    Imports DocumentFormat.OpenXml
    Imports DocumentFormat.OpenXml.Packaging
    Imports DocumentFormat.OpenXml.Spreadsheet
    
    Public Sub CreateExcelFileFromDataTable(dataTable As DataTable)
    	'Create a new Excel file
    	Dim filePath As String = "C:\example.xlsx"
    	'Create the SpreadsheetDocument object and set its type to Workbook
    	Using document As SpreadsheetDocument = SpreadsheetDocument.Create(filePath, SpreadsheetDocumentType.Workbook)
    		'Create the workbook
    		Dim workbookPart As WorkbookPart = document.AddWorkbookPart()
    		workbookPart.Workbook = New Workbook()
    		'Create the worksheet
    		Dim worksheetPart As WorksheetPart = workbookPart.AddNewPart(Of WorksheetPart)()
    		worksheetPart.Worksheet = New Worksheet()
    		'Create the sheet data
    		Dim sheetData As SheetData = worksheetPart.Worksheet.AppendChild(New SheetData())
    		'Create the header row
    		Dim headerRow As Row = New Row()
    		'Loop through each column in the DataTable and add it to the header row
    		For Each column As DataColumn In dataTable.Columns
    			headerRow.AppendChild(New Cell() With {.DataType = CellValues.String, .CellValue = New CellValue(column.ColumnName)})
    		Next
    
    		'Add the header row to the sheet data
    		sheetData.AppendChild(headerRow)
    		'Populate the data rows
    		For Each dataRow As DataRow In dataTable.Rows
    			Dim row As Row = New Row()
    			'Loop through each column in the DataTable and add the corresponding cell value to the current row
    			For Each column As DataColumn In dataTable.Columns
    				row.AppendChild(New Cell() With {.DataType = CellValues.String, .CellValue = New CellValue(dataRow(column.ColumnName).ToString())})
    			Next
    
    			'Add the row to the sheet data
    			sheetData.AppendChild(row)
    		Next
    
    		'Create the sheets
    		Dim sheets As Sheets = workbookPart.Workbook.AppendChild(New Sheets())
    		Dim sheet As Sheet = New Sheet() With {.Id = workbookPart.GetIdOfPart(worksheetPart), .SheetId = 1, .Name = "Sheet1"}
    		sheets.Append(sheet)
    		'Save changes
    		workbookPart.Workbook.Save()
    	End Using
    End Sub
    

     

    • MarcusH's avatar
      MarcusH
      Contributor III

      Thank you so much for that. I will test it next week and post an update.

      • Omkareshwar's avatar
        Omkareshwar
        Contributor II

        Also add these references in your BR

        C:\Program Files\OneStream Software\OneStreamAppRoot\OneStreamApp\bin\DocumentFormat.OpenXml.dll; C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\v3.0\WindowsBase.dll

         

    • MarkBird's avatar
      MarkBird
      Contributor III

      Hey Omkareshwar

      I'm trying to run your code, but I get the following error:

      Any idea what it could be? The path definitely exists...

      Mark

      • Omkareshwar's avatar
        Omkareshwar
        Contributor II

        Hi Mark,

        I can't say anything without having a look at your code.

         

    • SeanV's avatar
      SeanV
      New Contributor III

      How do you get these imports to work?


      Imports DocumentFormat.OpenXml
      Imports DocumentFormat.OpenXml.Packaging
      Imports DocumentFormat.OpenXml.Spreadsheet

      Is there a DLL or something that needs to be installed? 

      • MarkBird's avatar
        MarkBird
        Contributor III

        Hey Sean

        You need to add these two references to the business rule:

        C:\Program Files\OneStream Software\OneStreamAppRoot\OneStreamApp\bin\DocumentFormat.OpenXml.dll; C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\v3.0\WindowsBase.dll

         

         

  • OS_Pizza's avatar
    OS_Pizza
    Contributor III

    Are you looking to extract data to the excel sheet or exporting some report to an excel file ?

    • MarcusH's avatar
      MarcusH
      Contributor III

      It's not a report, it's security information that needs to be formatted in a particular way (Security Audit Reports doesn't have a report that will present the required information).

      • OS_Pizza's avatar
        OS_Pizza
        Contributor III

        You can use Streamwrite to write to files.

        Ex-

        Using sWriter As StreamWriter = File.CreateText(filePath)
        
        Dim line As New Text.StringBuilder
        
        sWriter.WriteLine(line.ToString())
    • MarcusH's avatar
      MarcusH
      Contributor III

      I couldn't see any functions in OpenXMLBuilder that allows me to create Excel files. Or are you suggesting using the generic Open XML package? 

    • MarcusH's avatar
      MarcusH
      Contributor III

      I have tried:

      Imports OpenXmlPowerTools.DocumentBuilder

      but I can't see where to go from there