Quick Start

Add Intechcore repository's creds to the maven's settings.xml (by default this file is in <your_home_dir>/.m2/settings.xml)

<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">

    <servers>
        <server>
            <id>intechcore-demo</id>
            <username>given_username</username>
            <password>given_password</password>
        </server>
    </servers>

</settings>

(if there's no file, create it and place all the content above)

Add the SCell Public API dependencies to the POM (api-interfaces-ui and api-impl-ui in case you need UI spreadsheet control):

    ...
    <repositories>
        <repository>
            <id>intechcore-demo</id>
            <name>scalable components demo</name>
            <url>https://nexus.intechcore.online/repository/maven-scomponents-demo</url>
        </repository>
    </repositories>
    ...
    <dependencies>
        ...
        <dependency>
            <groupId>com.intechcore.scomponents.scell</groupId>
            <artifactId>api-interfaces-core</artifactId>
            <version>1.0.3-java11</version>
        </dependency>
        <dependency>
            <groupId>com.intechcore.scomponents.scell</groupId>
            <artifactId>api-impl-core</artifactId>
            <version>1.0.3-java11</version>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>com.intechcore.scomponents.scell</groupId>
            <artifactId>api-interfaces-ui</artifactId>
            <version>1.0.3-java11</version>
        </dependency>
        <dependency>
            <groupId>com.intechcore.scomponents.scell</groupId>
            <artifactId>api-impl-ui</artifactId>
            <version>1.0.3-java11</version>
            <scope>runtime</scope>
        </dependency>
        ...
    </dependencies>
    ...
  • set your java version with -java8 or -java11

ATTENTION! Scope runtime is required!

Console application example:

import com.intechcore.scomponents.scell.api.IScellApiResolver;
import com.intechcore.scomponents.scell.api.ScellApiEntryPoint;
import com.intechcore.scomponents.scell.api.spreadsheet.IScellCoreApiFactory;
import com.intechcore.scomponents.scell.api.spreadsheet.model.IWorkbook;

import java.io.File;
import java.util.concurrent.CompletableFuture;

public class TestApp {
    private static final CompletableFuture<IScellApiResolver> apiResolverFuture
            = ScellApiEntryPoint.getApiResolverAsync();
    public static void main(String[] args) {
        apiResolverFuture.thenAccept(resolver -> {
            IScellCoreApiFactory apiFactory = resolver.resolve(IScellCoreApiFactory.class);
            IWorkbook newWorkbook = apiFactory.createNew();
            IWorkbook existingWorkbook = apiFactory.load(new File("/path/to/existing/file.xlsx"));
            // ...
        }).whenComplete((unused, throwable) -> {
            if (throwable != null) {
                System.out.println(throwable.getMessage());
            }
        }).join();
    }
}

The call ScellApiEntryPoint.getApiResolverAsync() return the IScellApiResolver implementation which will be used to resolve API entry points or register custom implementation of API interfaces.

IScellCoreApiFactory creates the main API object - IWorkbook, by creating a new empty spreadsheet or loading an existing one to further work.

UI Java FX application example

import com.intechcore.scomponents.scell.api.ScellApiEntryPoint;
import com.intechcore.scomponents.scell.api.spreadsheet.IScellCoreApiFactory;
import com.intechcore.scomponents.scell.api.fx.IScellUiApi;
import com.intechcore.scomponents.scell.api.fx.IScellUiApiBuilder;
import com.intechcore.scomponents.scell.api.fx.IScellUiFxApiBuilder;
import com.intechcore.scomponents.scell.api.fx.model.ContextMenuOwner;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

import java.util.concurrent.CompletableFuture;

public class TestAppUi extends Application {
    @Override
    public void start(Stage primaryStage) {
        BorderPane root = new BorderPane(new Label("Initializing ..."));

        ScellApiEntryPoint.getApiResolverAsync().thenApplyAsync(resolver -> {

            IScellCoreApiFactory apiFactory = resolver.resolve(IScellCoreApiFactory.class);

            IScellUiApiBuilder<Node> uiBuilder = resolver.resolve(IScellUiFxApiBuilder.class);

            IScellUiApi<Node> uiApi = uiBuilder
                    .enableContextMenu(ContextMenuOwner.EDITING_CELL, false)
                    .create(CompletableFuture.supplyAsync(apiFactory::createNew));
            return uiApi.createControl();
        }, Platform::runLater).whenCompleteAsync((node, throwable) -> {
            if (throwable != null) {
                node = new Label("Failed to init: " + throwable.getCause().getMessage());
            }
            root.setCenter(node);
        }, Platform::runLater);

        primaryStage.setScene(new Scene(root, 800, 600));
        primaryStage.show();
    }
}

To create the Java FX API entry point you need the implementation of IScellUiApiBuilder<Node> (or its alias IScellUiFxApiBuilder) and CompletableFuture of IWorkbook interface.

Adding content to cells and save workbook to file example

import com.intechcore.scomponents.scell.api.IScellApiResolver;
import com.intechcore.scomponents.scell.api.ScellApiEntryPoint;
import com.intechcore.scomponents.scell.api.spreadsheet.IScellCoreApiFactory;
import com.intechcore.scomponents.scell.api.spreadsheet.model.IWorkbook;
import com.intechcore.scomponents.scell.api.spreadsheet.service.builder.IRangeAddressBuilder;

import java.util.Random;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
import java.util.stream.IntStream;

public class FillExample {
    private static final CompletableFuture<IScellApiResolver> apiResolverFuture = ScellApiEntryPoint.getApiResolverAsync();

    public static void main(String[] args) {
        apiResolverFuture.thenAccept(resolver -> {
            IScellCoreApiFactory apiProvider = resolver.resolve(IScellCoreApiFactory.class);

            IWorkbook workbook = apiProvider.createNew();

            IRangeAddressBuilder addressBuilder = resolver.resolve(IRangeAddressBuilder.class);

            workbook.all().findFirst().ifPresent(worksheet -> {
                worksheet.inputContent(
                        addressBuilder.setTopLeft(1, 2).buildCell(),
                        "Date");

                worksheet.inputContent(
                        addressBuilder.setTopLeft(1, 3).buildCell(),
                        "Signature");

                Random random = new Random();
                IntStream.range(2, 40).forEach(rowNumber -> {
                    int columnNumber = 2;
                    worksheet.inputContent(
                            addressBuilder.setTopLeft(rowNumber, columnNumber++).buildCell(),
                            UUID.randomUUID().toString());
                    worksheet.inputContent(
                            addressBuilder.setTopLeft(rowNumber, columnNumber++).buildCell(),
                            UUID.randomUUID().toString());
                });
            });

            workbook.getWriter().fileName("fillExample").save();
        }).whenComplete((unused, throwable) -> {
            if (throwable != null) {
                System.out.println(throwable.getMessage());
            }
        }).join();
    }
}

See also

Reference