We are under construction!

You may experience downtime, errors or visual oddities, but we anticipate all will be resolved by the end of the day.

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