OleFrame cannot save Excel files

I am setting up an application with an OLE frame for inplace editing. Everything is fine for Word files, but saving Excel does not work. The save button for the Excel application is either grayed out (I think when non-OLE Excel is still open) or if it is not grayed out, it says โ€œRefreshโ€ (in German, but still) and does not save. Error messages are not displayed.

OleControlSite#save(File, boolean) works, but we canโ€™t explain to our customers why they cannot click the Excel save button, so we need to fix it somehow.

A small demonstration to reproduce the problem:

public class OleDemoDialog extends Dialog {

public static void main(String[] args) {
    OleDemoDialog dialog = new OleDemoDialog(new Shell());
    dialog.open();
}

protected OleDemoDialog(Shell parentShell) {
    super(parentShell);
    setShellStyle(getShellStyle()| SWT.SHELL_TRIM);
}

@Override
protected Control createDialogArea(Composite parent) {
    OleFrame oleFrame = new OleFrame(parent, SWT.CLIP_CHILDREN);
    oleFrame.setBackground(JFaceColors.getBannerBackground(parent
            .getDisplay()));
    oleFrame.setLayoutData(new GridData(GridData.FILL_BOTH));

    OleControlSite oleControlSite = new OleControlSite(oleFrame, SWT.NONE,
            new File("Mappe1.xlsx"));
    oleControlSite.doVerb(OLE.OLEIVERB_INPLACEACTIVATE);

    return oleFrame;
}

@Override
protected Point getInitialSize() {
    return new Point(600, 600);
}
}
+4
source share
1 answer

Excel OleFrame.

OleClientSite clientSite.save(new File("D:\\JavaBooks.xlsx"), true);

, .

import java.io.*;
import org.eclipse.swt.*;
import org.eclipse.swt.events.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.ole.win32.*;
import org.eclipse.swt.widgets.*;

public class OleDemoDialog {

    OleClientSite clientSite;
    OleFrame oleFrame;

    public static void main(String[] args) {
        Display display = new Display();
        OleDemoDialog example = new OleDemoDialog();
        example.open(display);
    }

    public void open(Display display) {
        Shell shell = new Shell(display);
        shell.setText("OleDemoDialog Example");
        shell.setLayout(new FillLayout());

        Composite parent = new Composite(shell, SWT.NONE);
        parent.setLayout(new GridLayout(4, true));

        Composite buttons = new Composite(parent, SWT.NONE);
        buttons.setLayout(new GridLayout());
        GridData gridData = new GridData(SWT.BEGINNING, SWT.FILL, false, false);
        buttons.setLayoutData(gridData);

        Composite displayArea = new Composite(parent, SWT.BORDER);
        displayArea.setLayout(new FillLayout());
        displayArea.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 3, 1));

        Button openButton = new Button(buttons, SWT.NONE);
        openButton.setText("Open file");
        openButton.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                //new File("your File_Path.xlsx ")
                try {
                    clientSite = new OleClientSite(oleFrame, SWT.NONE, "Excel.Sheet", new File("D:\\JavaBooks.xlsx"));
                } catch (SWTException error) {error.printStackTrace();}
                if (clientSite != null)
                    clientSite.doVerb(OLE.OLEIVERB_INPLACEACTIVATE);
            }
        });
        new Label(buttons, SWT.NONE);

        Button excelButton = new Button(buttons, SWT.NONE);
        excelButton.setText("Save");
        excelButton.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {

                clientSite.save(new File("D:\\JavaBooks.xlsx"), true);
                System.out.println("save..");
            }
        });

        oleFrame = new OleFrame(displayArea, SWT.NONE);
        shell.setSize(800, 600);
        shell.open();

        while (!shell.isDisposed()) {
            if (!display.readAndDispatch())
                display.sleep();
        }
    }
}
-1

Source: https://habr.com/ru/post/1547693/


All Articles