Code Monkey home page Code Monkey logo

libxlsxwriter's Introduction

Create Excel files with Haskell

This repo provides Haskell bindings for C library libxlsxwriter

Example usage

This example uses Yesod web framework

getExcelExportR :: Handler ()
getExcelExportR = do
  lfilter   <- parseLeadFilter Nothing
  data     <- runDB $ filterLeadList lfilter { lfLimit  = Just 1000
                                              , lfOffset = Nothing
                                              }
  gathering <- runDB $ gather [] data

  payload <- liftIO $ do
    path    <- (</>) <$> getTemporaryDirectory <*> replicateM 10 (randomRIO ('a', 'z'))
    wbook   <- workbookNew path
    wsheet  <- workbookAddWorksheet wbook "Excel example"

    titleFormat <- workbookAddFormat wbook
    formatSetBold titleFormat
    formatSetAlign titleFormat AlignCenter

    timeFormat <- workbookAddFormat wbook
    formatSetNumFormat timeFormat "DD/MM/YY HH:MM"

    let titles = [ ("Id",        10)
                 , ("Name", 30)
                 , ("Address",   60)
                 , ("Added",     20)
                 , ("Added By",  20)
                 , ("No. Sales", 10)
                 , ("No. Calls", 10)
                 ]

    forM_ (zip [0 ..] titles) $ \(index, (title, width)) -> do
      worksheetSetColumn wsheet index index width Nothing
      worksheetWriteString wsheet 0 index title (Just titleFormat)

    forM_ (zip [1 ..] data) $ \(row, Entity key item) -> do
      worksheetWriteString wsheet row 0 (unpack (toPathPiece key)) Nothing
      worksheetWriteString wsheet row 1 (unpack (dataListItemName item)) Nothing
      worksheetWriteString wsheet row 2 (unpack (dataListItemAddress item)) Nothing
      worksheetWriteUTCTime wsheet row 3 (dataListItemAdded item) (Just timeFormat)
      worksheetWriteString wsheet row 4 (dataListItemAddedBy item) Nothing 
      worksheetWriteNumber wsheet row 5 (fromRational $ toRational $ dataListItemNumSales item) Nothing
      worksheetWriteNumber wsheet row 6 (fromRational $ toRational $ dataListItemNumCalls item) Nothing

    workbookClose wbook
    blob <- BS.readFile path
    removeFile path
    return blob

  time <- formatTime defaultTimeLocale "%Y-%m-%d" <$> liftIO getCurrentTime
  addHeader "Content-Disposition" [st|attachment; filename="Excel-example #{time}.xlsx"|]
  sendResponse ("application/vnd.ms-excel" :: ContentType, toContent payload)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.