• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Импорт из Excel в Lotus

k85

Lotus Team
11.10.2011
260
1
BIT
0
всем привет. может у кого-то есть готовый код по импорту из эксел в лотус. просто в поиске никак не находится нормальная информация. но точно где-то попадался готовый код и может даже здесь
 

alexas1

Green Team
10.04.2014
1 202
225
BIT
37
напр
Sub Click(Source As Button)
Dim xlFilename As String
xlFilename = Inputbox$("Файл импорта по умолчанию.", "Файл для импорта Диск:\import.XLS", "c:\import\Ks_view.xlsx")
Dim session As New NotesSession
Dim db As NotesDatabase
Dim view As NotesView
Dim doc As NotesDocument
Set db = session.CurrentDatabase
Dim row As Integer
Dim written As Integer
Dim number0 As Integer
Dim number As Integer
'number0 = Inputbox$("Введите колличество строк", "Строка Старт")
number = Inputbox$("Введите колличество строк", "Строка Финиш")
Dim Excel As Variant
Dim xlWorkbook As Variant
Dim xlSheet As Variant
Dim xlCells As Variant
Set Excel = CreateObject("excel.application")
Excel.Visible = False
Print "Открыт файл " & xlFilename & "..."
Excel.Workbooks.Open xlFilename '// открытие файла Excel
Set xlWorkbook = Excel.ActiveWorkbook
Set xlSheet = xlWorkbook.ActiveSheet
Set xlCells = xlSheet.Cells
row = 0
'row = number0
written = 0
Print "Starting import from Excel file..."
Dim strName As String
Add:
row = row + 1
written=written+1
Print ("Импорт строки: "& Cstr(row) & " из: " &Cstr(number))
Set view = db.GetView("import")'представление где после импорта отображаются созданные документы
strName = xlCells( row, 1). Value
Set doc = view.GetDocumentByKey(strName ,True)
If doc Is Nothing Then
Set doc = db.CreateDocument
With doc
.Form = "Couple"
.ProgrammAge=xlCells(row, 1).Value
.ClubCoach=xlCells(row, 2).Value
.Organisation=xlCells(row, 3).Value
.Country=xlCells(row, 4).Value
.Partner=xlCells(row, 5).Value
.BirthP=xlCells(row, 6).Value
.Lady=xlCells(row, 7).Value
.BirthL=xlCells(row, 8).Value


End With
Else
End If
Call doc.Save( True, True )
Set doc = Nothing
If written < number Then Goto Add
excel.quit
Msgbox ("Finish")
Dim ws As New NotesUIWorkspace
Call ws.ViewRefresh
End Sub
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
215
всем привет. может у кого-то есть готовый код по импорту из эксел в лотус. просто в поиске никак не находится нормальная информация. но точно где-то попадался готовый код и может даже здесь
есть куча кода и 100500 вариантов
-сейчас использую POI + xpages запускаю из классики
-подключены плаги для ODA
-обновление/создание дока по инфе из вьюшки
-настройки сервера с файлами и конфигурация шита - в БД
-сервер с файлами - NextCloud, там есть создание временой ссылки на файл
Суть: загрузка хехеля по хттп, парсинг чере POI, обновление инфы в доках следуя инфе в энтрисах вьюшки
сам код обработки:
Java:
import java.util.List;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.logging.Level;

import org.openntf.domino.Database;
import org.openntf.domino.Document;
import org.openntf.domino.ViewEntry;
import org.openntf.domino.Item;
import org.openntf.domino.Session;
import org.openntf.domino.View;
import org.openntf.domino.utils.Factory;
import org.openntf.domino.utils.Factory.SessionType;
import org.openntf.domino.xsp.XspOpenLogUtil;
import org.openntf.domino.RichTextItem;
/**
*
* @author user1
* Update/create documents according view key
*/
public class ODAItems {
    private final String classID="::"
            + new Throwable().getStackTrace()[0].getClassName() + "::";
    private Access access = new Access();

    private final List<String> list = new ArrayList<String>();

    Session ses;
    Database db;
    View view;
    Document logDoc;
    RichTextItem logBody;
    String form;

    ODAItems(String viewName) {
        Throwable throwable = new Throwable();
        ses = Factory.getSession();// SessionType.CURRENT
        db = ses.getCurrentDatabase();
        logDoc = db.createDocument();
        logDoc.replaceItemValue("Form", Access.LOG_FRM);
        logBody = logDoc.createRichTextItem(Access.BODY_FLD);
        access.setDefAccess(logDoc, ses.getEffectiveUserName());
        logDoc.save();
        // logDoc.computeWithForm(false, false);
        view = db.getView(viewName);
        XspOpenLogUtil.logEvent(throwable, this.classID + "<-"
                + throwable.getStackTrace()[1].getClassName() + "."
                + throwable.getStackTrace()[1].getMethodName(), Level.INFO,
                logDoc);
        if (view != null) {
            view.setAutoUpdate(false);
            view.refresh();
        } else
            XspOpenLogUtil.logErrorEx(throwable, this.classID + "view is null:"
                    + viewName, Level.INFO, null);
    }



    /*
     * (non-Javadoc)
     *
     * @see com.setralubs.ODAItems#updateItem(java.util.Map)
     * map - <KeyValue, <FieldName, FieldValues>>
     */
    public void updateItems(Map<String, Map<String, Object>> map) {
        /*
         * ViewNavigator nav = view.createViewNav(); nav.skip(1000000);
         *
         * System.out.println("CacheSize: " + nav.getCacheSize());
         */
        if (view != null) {
            Document doc = null;
            for (Entry<String, Map<String, Object>> flds : map.entrySet()) {
                String key = flds.getKey();
                doc = view.getFirstDocumentByKey(key, true);
                if (doc != null)
                    //replace all values to new
                    if (!doc.entrySet().containsAll(flds.getValue().entrySet())) doc.putAll(flds.getValue());
                else {
                    //create doc with values (from flds map), set permissions and form
                    doc = db.createDocument(flds.getValue());
                    doc.replaceItemValue("form", form);
                    access.setDefAccess(doc, ses.getEffectiveUserName());
                }
                if (doc.save()) {
                    list.add(key);
                }
            }
            // view.setAutoUpdate(true);
        }
    }

    /*
     * (non-Javadoc)
     *
     * @see com.setralubs.ODAItems#updateItem(java.lang.String, java.util.Map)
     */
    public void updateItem(String key, Map<String, String> value) {
        if (view != null && key != null && !key.isEmpty()
                && !list.contains(key)) {
            Document doc = null;
            ViewEntry entry = view.getFirstEntryByKey(key, true);
            // doc = view.getFirstDocumentByKey(key, true);
            boolean bSave = false;
            if (entry != null) {
                bSave = !entry.getColumnValuesMap().entrySet().containsAll(
                        value.entrySet());
                // doc = entry.getDocument();
                // bSave = !doc.asDocMap().entrySet()
                // .containsAll(value.entrySet());
                if (bSave) {
                    doc = entry.getDocument();
                    logBody.appendText(entry.getColumnValuesMap().entrySet().toString());
                    // logBody.appendText(doc.asDocMap().entrySet().toString());
                    logBody.addNewLine();
                    logBody.appendText("update doc with:");
                    doc.putAll(value);
                }
            } else {
                bSave = true;
                logBody.appendText("new doc with:");
                doc = db.createDocument(value);
                doc.replaceItemValue("form", form);
                access.setDefAccess(doc, ses.getEffectiveUserName());
            }
            if (bSave && doc.save()) {
                logBody.appendText(value.toString());
                logBody.appendDocLink(doc);
                logBody.addNewLine();
                list.add(key);
            }
        }
    }

    void close() {
        logDoc.save();
    }
}
ф-ция вызываемая на каждую строку из эхеля public void updateItem(String key, Map<String, String> value)
где value - хэшмап в виде <имя поля, значение>
ведется лог в OpenLog базу и запись дока в тек. БД (ссылка попадает в OpenLog)
все эксепшены валятся в OpenLog, там же и последовательность вызовов (конструкторы пишут)
мне очень удобно и наглядно
запуск xpage через классику здесь выкладывал
костяк обработки на POI
Java:
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;
import java.util.logging.Level;

import javax.xml.parsers.ParserConfigurationException;

import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.ss.usermodel.DataFormatter;
import org.apache.poi.ss.util.CellAddress;
import org.apache.poi.ss.util.CellReference;
import org.apache.poi.util.SAXHelper;
import org.apache.poi.xssf.eventusermodel.ReadOnlySharedStringsTable;
import org.apache.poi.xssf.eventusermodel.XSSFReader;
import org.apache.poi.xssf.eventusermodel.XSSFSheetXMLHandler;
import org.apache.poi.xssf.model.StylesTable;
import org.apache.poi.xssf.usermodel.XSSFComment;
import org.openntf.domino.xsp.XspOpenLogUtil;
import org.xml.sax.ContentHandler;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;

public class ItemsInfo {
    private final String classID = "::"
            + new Throwable().getStackTrace()[0].getClassName() + "::";
    final Map<Integer, String> mapFields;
    static final String PROD_NAME_FLD = "prodName";
    static final String FUSION_FLD = "fusion";
    static final String $PROD_NAME_FLD = "$" + PROD_NAME_FLD;
    static final String PACK_FLD = "pack";
    String sheetName = "Materials_base";
    OPCPackage xlsxPackage;
    final RowProcessor rowProcessor;
    final ConfigReader configReader;//read options docs according OPTIONS
    DocConfig docConf;//based on certain configuration doc, could be init in createMap()
    String server;//server url for resources, could be used from inherited classes

    Map<Integer, String> createMap(String mapName) {
        return null;
    };

    BatchStream output = new BatchStream();

    public ItemsInfo(String mapName) {
        Throwable throwable = new Throwable();
        XspOpenLogUtil.logEvent(throwable, classID + "<-"
                + throwable.getStackTrace()[1].getClassName() + "."
                + throwable.getStackTrace()[1].getMethodName(), Level.INFO,
                null);
        configReader = new ConfigReader();
        mapFields = createMap(mapName);
        rowProcessor = new RowProcessor(mapFields);
    }

    class BatchStream {

        public void append(CharSequence csq) {
            //System.out.append(csq);
        }

        public void append(char c) {
            //System.out.print(c);
        }

        public void print(String s) {
            //System.out.print(s);
        }

        public void println(String s) {
            //System.out.println(s);
        }

        public void println() {
        }
    }

    /**
     * Number of columns to read starting with leftmost
     */
    int minColumns = -1;

    void init(OPCPackage xlsxPackage, int minColumns) {
        this.xlsxPackage = xlsxPackage;
        this.minColumns = minColumns;
    }

    // https://stackoverflow.com/a/4916805
    // according to initialization order (before constructor)

    class SheetToCSV implements XSSFSheetXMLHandler.SheetContentsHandler {
        private boolean firstCellOfRow = false;
        private int currentRow = -1;
        private int currentCol = -1;

        private void outputMissingRows(int number) {
            /*
             * for (int i=0; i<number; i++) { for (int j=0; j<minColumns; j++) {
             * output.append(','); } output.append('\n'); }
             */
        }

        @Override
        public void startRow(int rowNum) {
            // If there were gaps, output the missing rows
            outputMissingRows(rowNum - currentRow - 1);
            // Prepare for this row
            firstCellOfRow = true;
            currentRow = rowNum;
            rowProcessor.startRow(currentRow);
            currentCol = -1;
        }

        @Override
        public void endRow(int rowNum) {
            // Ensure the minimum number of columns
            for (int i = currentCol; i < minColumns; i++) {
                output.append(',');
            }
            output.append('\n');
            rowProcessor.endRow();
        }

        @Override
        public void cell(String cellReference, String formattedValue,
                XSSFComment comment) {
            if (firstCellOfRow) {
                firstCellOfRow = false;
            } else {
                output.append(',');
            }

            // gracefully handle missing CellRef here in a similar way as
            // XSSFCell does
            if (cellReference == null) {
                cellReference = new CellAddress(currentRow, currentCol)
                        .formatAsString();
            }

            // Did we miss any cells?
            int thisCol = (new CellReference(cellReference)).getCol();
            int missedCols = thisCol - currentCol - 1;
            try {
                for (int i = 0; i < missedCols; i++) {
                    output.append(',');
                    rowProcessor.cellValue(currentCol + 1 + i, "");
                }
                currentCol = thisCol;
                rowProcessor.cellValue(currentCol, formattedValue);
                // Number or string?
                // noinspection ResultOfMethodCallIgnored
                Double.parseDouble(formattedValue);
                output.append(formattedValue);
            } catch (NumberFormatException e) {
                output.append('"');
                output.append(formattedValue);
                output.append('"');
            }
        }

        @Override
        public void headerFooter(String text, boolean isHeader, String tagName) {
            // Skip, no headers or footers in CSV
        }
    }

    public void processSheet(StylesTable styles,
            ReadOnlySharedStringsTable strings,
            XSSFSheetXMLHandler.SheetContentsHandler sheetHandler,
            InputStream sheetInputStream) throws IOException, SAXException {
        DataFormatter formatter = new DataFormatter();
        InputSource sheetSource = new InputSource(sheetInputStream);
        try {
            XMLReader sheetParser = SAXHelper.newXMLReader();
            ContentHandler handler = new XSSFSheetXMLHandler(styles, null,
                    strings, sheetHandler, formatter, false);
            sheetParser.setContentHandler(handler);
            sheetParser.parse(sheetSource);
            this.rowProcessor.close();
        } catch (ParserConfigurationException e) {
            throw new RuntimeException("SAX parser appears to be broken - "
                    + e.getMessage());
        }
    }

    public void processIn(InputStream in) throws OpenXML4JException,
            SAXException, IOException {
        OPCPackage p = OPCPackage.open(in);// , PackageAccess.READ);
        init(p, -1);
        process();
        p.close();
    }
    public void processIn(InputStream in, String sheetName) throws OpenXML4JException,
    SAXException, IOException {
        this.sheetName=sheetName;
        processIn(in);
    }

    void process() throws IOException, OpenXML4JException, SAXException {
        Throwable throwable = new Throwable();
        String methodID = classID
                + throwable.getStackTrace()[0].getMethodName() + ":";
        ReadOnlySharedStringsTable strings = new ReadOnlySharedStringsTable(
                this.xlsxPackage);
        XSSFReader xssfReader = new XSSFReader(this.xlsxPackage);
        StylesTable styles = xssfReader.getStylesTable();
        XSSFReader.SheetIterator iter = (XSSFReader.SheetIterator) xssfReader
                .getSheetsData();
        int index = 0;
        while (iter.hasNext()) {
            InputStream stream = iter.next();
            String sheetName = iter.getSheetName();
            XspOpenLogUtil.logEvent(throwable, methodID + sheetName
                    + " [index=" + index + "]:", Level.INFO, null);
            if (this.sheetName.equalsIgnoreCase(sheetName)){
                XspOpenLogUtil.logEvent(throwable, methodID
                        + "processing Rows...", Level.INFO, null);
                processSheet(styles, strings, new SheetToCSV(), stream);
            }
            stream.close();
            ++index;
        }
    }
}
обработка строк
Java:
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;

import org.openntf.domino.Database;
import org.openntf.domino.Document;
import org.openntf.domino.RichTextItem;
import org.openntf.domino.Session;
import org.openntf.domino.utils.Factory;
import org.openntf.domino.xsp.XspOpenLogUtil;

public class RowProcessor {
    final private Map<Integer, String> flds = new HashMap<Integer, String>();
    final private Map<String, String> value = new HashMap<String, String>();
    final ODAItems odaPrice;
    private final String classID = "::" + this.getClass().getName() + "::";

    private Access access = new Access();
    Session ses;
    Database db;
    Document logDoc=null;
    RichTextItem logBody=null;
    String form;


    RowProcessor(Map<Integer, String> mapFields) {
        Throwable throwable = new Throwable();
       
/*        ses = Factory.getSession();// SessionType.CURRENT
        db = ses.getCurrentDatabase();
        logDoc = db.createDocument();
        logDoc.replaceItemValue("Form", Access.LOG_FRM);
        logBody = logDoc.createRichTextItem(Access.BODY_FLD);
        access.setDefAccess(logDoc, ses.getEffectiveUserName());
        logBody.appendText("Row Processor");
        logBody.addNewLine();
        logDoc.save();
*/
        XspOpenLogUtil.logEvent(throwable, classID + "<-"
                + throwable.getStackTrace()[1].getClassName() + "."
                + throwable.getStackTrace()[1].getMethodName()+":"
                + "\nmapFields:\n"
                + mapFields.toString()
                , Level.INFO,
                logDoc);
        odaPrice = new ODAPrice();
        this.flds.putAll(mapFields);
    }

    void startRow(int num) {
/*        logBody.appendText("Row#"+new Integer(num).toString());
        logBody.addNewLine();
*/
        }

    void endRow() {
        //update doc by FusionInfo.FUSION_FLD key
        odaPrice.updateItem(value.get(FusionInfo.FUSION_FLD), value);
        value.clear();
        //logBody.addNewLine();
    }

    void close() {
        //logDoc.save();
        odaPrice.close();
    }

    /**
     *
     * @param num
     *            column
     * @param formattedValue
     *            value
     */
    void cellValue(int num, String formattedValue) {
        if (this.flds.containsKey(num)){
            //set value map according excel fields map (col# -> fieldName)
            value.put(this.flds.get(num), formattedValue);
        }else{
           
        }
        //logBody.appendText(new Integer(num).toString() + ">" + formattedValue +";");
    }

}
 
Последнее редактирование:
  • Нравится
Реакции: Gandliar

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
215
сделал для мультивэлью полей + добавление в айтем (а не перезапись) с учетом уникальности значений (в мультивэлью)
несколько корявый вариант, но с моей тз - лучше чем руками сканить на уникальность
Кусок:
Java:
                                List<String>lst=((List<String>) value.get(k));
                                arr.removeAll(lst);
                                arr.addAll(lst);
весь код ODAItems
Java:
package com.setralubs;

import java.util.List;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.logging.Level;

import org.openntf.domino.Database;
import org.openntf.domino.Document;
import org.openntf.domino.ViewEntry;
import org.openntf.domino.Item;
import org.openntf.domino.Session;
import org.openntf.domino.View;
import org.openntf.domino.utils.Factory;
import org.openntf.domino.utils.Factory.SessionType;
import org.openntf.domino.xsp.XspOpenLogUtil;
import org.openntf.domino.RichTextItem;
/**
 *
 * @author user1
 * Update/create documents according view key
 */
public class ODAItems {
    private final String classID="::"
            + new Throwable().getStackTrace()[0].getClassName() + "::";
    private Access access = new Access();

    private final List<String> list = new ArrayList<String>();

    Session ses;
    Database db;
    View view;
    Document logDoc;
    RichTextItem logBody;
    String form;
    boolean isAppend;
    
    ODAItems(String viewName) {
        Throwable throwable = new Throwable();
        ses = Factory.getSession();// SessionType.CURRENT
        db = ses.getCurrentDatabase();
        logDoc = db.createDocument();
        logDoc.replaceItemValue("Form", Access.LOG_FRM);
        logBody = logDoc.createRichTextItem(Access.BODY_FLD);
        access.setDefAccess(logDoc, ses.getEffectiveUserName());
        logDoc.save();
        // logDoc.computeWithForm(false, false);
        view = db.getView(viewName);
        XspOpenLogUtil.logEvent(throwable, this.classID + "<-"
                + throwable.getStackTrace()[1].getClassName() + "."
                + throwable.getStackTrace()[1].getMethodName(), Level.INFO,
                logDoc);
        if (view != null) {
            view.setAutoUpdate(false);
            view.refresh();
        } else
            XspOpenLogUtil.logErrorEx(throwable, this.classID + "view is null:"
                    + viewName, Level.INFO, null);
    }



    /*
     * (non-Javadoc)
     *
     * @see com.setralubs.ODAItems#updateItem(java.util.Map)
     * map - <KeyValue, <FieldName, FieldValues>>
     */
    public void updateItems(Map<String, Map<String, Object>> map) {
        /*
         * ViewNavigator nav = view.createViewNav(); nav.skip(1000000);
         *
         * System.out.println("CacheSize: " + nav.getCacheSize());
         */
        if (view != null) {
            Document doc = null;
            for (Entry<String, Map<String, Object>> flds : map.entrySet()) {
                String key = flds.getKey();
                doc = view.getFirstDocumentByKey(key, true);
                if (doc != null)
                    //replace all values to new
                    if (!doc.entrySet().containsAll(flds.getValue().entrySet())) doc.putAll(flds.getValue());
                else {
                    //create doc with values (from flds map), set permissions and form
                    doc = db.createDocument(flds.getValue());
                    doc.replaceItemValue("form", form);
                    access.setDefAccess(doc, ses.getEffectiveUserName());
                }
                if (doc.save()) {
                    list.add(key);
                }
            }
            // view.setAutoUpdate(true);
        }
    }

    /*
     * (non-Javadoc)
     *
     * @see com.setralubs.ODAItems#updateItem(java.lang.String, java.util.Map)
     */
    public void updateItem(String key, Map<String, Object> value) {
        if (view != null && key != null && !key.isEmpty()
                && !list.contains(key)) {
            Document doc = null;
            ViewEntry entry = view.getFirstEntryByKey(key, true);
            // doc = view.getFirstDocumentByKey(key, true);
            boolean bSave = false;
            if (entry != null) {
                bSave = !entry.getColumnValuesMap().entrySet().containsAll(
                        value.entrySet());
                // doc = entry.getDocument();
                // bSave = !doc.asDocMap().entrySet()
                // .containsAll(value.entrySet());
                if (bSave) {
                    doc = entry.getDocument();
                    logBody.appendText(entry.getColumnValuesMap().entrySet().toString());
                    // logBody.appendText(doc.asDocMap().entrySet().toString());
                    logBody.addNewLine();
                    if (isAppend) {
                        logBody.appendText("!append items");
                        logBody.addNewLine();
                        Map<String, Object> tmp = doc.asDocMap();
                        for (String k : value.keySet()) {
                            List<String> arr=new ArrayList<String>();
                            if (tmp.get(k) instanceof Collection<?>) {
                                arr.addAll((Collection<? extends String>) tmp.get(k));
                            }else if(tmp.get(k)!=null){
                                arr.add(tmp.get(k).toString());
                            }
                            if (value.get(k) instanceof Collection<?>) {
                                //for unique
                                List<String>lst=((List<String>) value.get(k));
                                arr.removeAll(lst);
                                arr.addAll(lst);
                            }else{
                                if(!arr.contains(value.get(k).toString()))arr.add(value.get(k).toString());
                            }
                            value.put(k,arr);
                        }
                    }
                    logBody.appendText("update doc with:");
                    doc.putAll(value);
                }
            } else {
                bSave = true;
                logBody.appendText("new doc with:");
                doc = db.createDocument(value);
                doc.replaceItemValue("form", form);
                access.setDefAccess(doc, ses.getEffectiveUserName());
            }
            if (bSave && doc.save()) {
                logBody.appendText(value.toString());
                logBody.appendDocLink(doc);
                logBody.addNewLine();
                list.add(key);
            }
        }
    }

    void close() {
        logDoc.save();
    }
}
изменения внесены и во обработку строки, но я сделал без передачи пераметра на isAppend, а тупо делаю дополнение поля если мультивэлью
Java:
package com.setralubs;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;

import org.openntf.domino.Database;
import org.openntf.domino.Document;
import org.openntf.domino.RichTextItem;
import org.openntf.domino.Session;
import org.openntf.domino.utils.Factory;
import org.openntf.domino.xsp.XspOpenLogUtil;

public class RowProcessor {
    String SEP = ";";
    final private Map<Integer, String> flds = new HashMap<Integer, String>();
    final private Map<String, Object> value = new HashMap<String, Object>();
    final ODAItems odaPrice;
    private final String classID = "::" + this.getClass().getName() + "::";

    private Access access = new Access();
    Session ses;
    Database db;
    Document logDoc=null;
    RichTextItem logBody=null;
    String form;


    RowProcessor(Map<Integer, String> mapFields) {
        Throwable throwable = new Throwable();
        
/*        ses = Factory.getSession();// SessionType.CURRENT
        db = ses.getCurrentDatabase();
        logDoc = db.createDocument();
        logDoc.replaceItemValue("Form", Access.LOG_FRM);
        logBody = logDoc.createRichTextItem(Access.BODY_FLD);
        access.setDefAccess(logDoc, ses.getEffectiveUserName());
        logBody.appendText("Row Processor");
        logBody.addNewLine();
        logDoc.save();
*/
        XspOpenLogUtil.logEvent(throwable, classID + "<-"
                + throwable.getStackTrace()[1].getClassName() + "."
                + throwable.getStackTrace()[1].getMethodName()+":"
                + "\nmapFields:\n"
                + mapFields.toString()
                , Level.INFO,
                logDoc);
        odaPrice = new ODAPrice();
        this.flds.putAll(mapFields);
    }

    void startRow(int num) {
/*        logBody.appendText("Row#"+new Integer(num).toString());
        logBody.addNewLine();
*/
        }

    void endRow() {
        //update doc by FusionInfo.FUSION_FLD key
        if (value.get(FusionInfo.FUSION_FLD)!=null)odaPrice.updateItem(value.get(FusionInfo.FUSION_FLD).toString(), value);
        value.clear();
        //logBody.addNewLine();
    }

    void close() {
        //logDoc.save();
        odaPrice.close();
    }

    /**
     *
     * @param num
     *            column
     * @param formattedValue
     *            value
     */
    void cellValue(int num, String formattedValue) {
        if (this.flds.containsKey(num)){
            //set value map according excel fields map (col# -> fieldName)
            boolean bString=formattedValue.indexOf(SEP)<0;
            if (!bString)odaPrice.isAppend=true;
            value.put(this.flds.get(num),
                    bString?formattedValue:
                        new ArrayList<String>(Arrays.asList(formattedValue.split(SEP,-1))));
        }else{
            
        }
        //logBody.appendText(new Integer(num).toString() + ">" + formattedValue +";");
    }

}
 

Eugen

Green Team
22.03.2012
210
1
BIT
1
Всем привет.

Вопрос не совсем по теме, но близок...
Есть агент, который формирует xls файл через COM. Вызывается через веб - из xPage через runWithDocumentContext.
Примерный код:
Код:
    Dim app, wBook, wSheet
    Dim fPath As String
    Dim fName As String

    Set app=createObject("Excel.Application")
    Set wBook=app.workbooks.add(1)
    Set wSheet=wBook.sheets(1)
   
    fPath = "D:\tmp\"
   
    %REM
        some logic...
    %END REM

   
    fName = fpath & CLng(Rnd() * 100000) & ".xls"
   
    wBook.saveAs fName, -4143
    app.Quit

В строке "wBook.saveAs fName, -4143" возникает ошибка "Microsoft Excel: Метод SaveAs из класса Workbook завершен неверно". Не пойму куда копать...
На локале все отрабатывает корректно.

Кто-нибудь сталкивался? Офис на сервере 2010-й. Пробовал saveAs без второго аргумента(т.е. без формата) - не пашет.

ПЫСЫ: Пробовал просто через веб вызвать агент сслывкой типа - эффекто тот же.
 

garrick

Lotus Team
26.10.2009
1 351
151
BIT
188
с правами все норм. Ни в одну папку не сохраняет, при этом в ту же директорию я могу сформировать текстовый файл с помощью Print
Ты можешь, а он нет. У него нет прав. Под каким пользователем запущен Domino на сервере Windows, какие у этого пользователя права? И ещё права на COM объект могут быть какие-нибудь.
 
Последнее редактирование:

Eugen

Green Team
22.03.2012
210
1
BIT
1
Ты можешь, а он нет
Через Print сервер может, я это имел в виду. Решил проблему весьма странным образом, вычитанным в сети: создал папки "C:\windows\system32\config\systemprofile\Desktop" и "C:\windows\sysWOW64\config\systemprofile\Desktop" и ребутнул тачку.
 
  • Нравится
Реакции: Domino-Designer

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
215
Есть агент, который формирует xls файл через COM. Вызывается через веб - из xPage через runWithDocumentContext.
вот разные извращения видал, но такое... ;)
xPages кот. с jvm и стало быть с POI и всякие ништяки взять и использовать для вызова КОМы...
как пример готового плагина
 
Последнее редактирование:
  • Нравится
Реакции: VladSh

VladSh

начинающий
Lotus Team
11.12.2009
1 786
157
BIT
78
lmike
(y)

Eugen
У нас всё гонится в csv. А у юзеров у всех csv автоматом открывается в Excel.
 

Eugen

Green Team
22.03.2012
210
1
BIT
1
вот разные извращения видал, но такое... ;)
xPages кот. с jvm и стало быть с POI и всякие ништяки взять и использовать для вызова КОМы...
как пример готового плагина
Плагин этот тоже пользуем, но не всегда он удобен для Excel. Что по поводу агента с COM - он с каких-то древних времен, поэтому и остался в таком виде.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
215
Что по поводу агента с COM - он с каких-то древних времен
как-то по контракту писал рапер для эхелевской КОМы, для ЛС, все один в один получилось (тогда использовал не POI, но тоже java либу)
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!