автоматический импорт в лотус

Irina

Green Team
31.05.2019
145
2
BIT
0
добрый день

необходимо сделать импорт в указанную форму и в определенные поля из файла , например excel, в лотус агентом (по расписанию)
начала просто пробовать по кнопке.

Подскажите, пожалуйста если я такого вида код переделаю для агента - он будет нормальным, или лучше импорт с сервера запускать по другому?

Код:
Sub Initialize

    Dim xlFilename As String
    xlFilename = Inputbox$("Файл импорта по умолчанию.", "Файл для импорта Диск:\f2.XLS", "c:\f2.xls")
    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 number As Integer
    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 = 1
    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("view")'представление где после импорта отображаются созданные документы
        strName = xlCells( row, 1). Value
        Set doc = view.GetDocumentByKey(strName ,True)
        If doc Is Nothing Then
                Set doc = db.CreateDocument
                With doc
                        .Form = "form"
                        .a= xlCells(row, 1).Value
                        .a_1= xlCells( row, 2 ).Value
                        .a_2= xlCells(row,  3).Value
                End With
        Else
        End If
        Call doc.Save( True, True )
        Set doc = Nothing
        If written < number Then Goto Add
        excel.quit
        Dim ws As New NotesUIWorkspace
        Call ws.ViewRefresh
End Sub
 

alexas1

Green Team
10.04.2014
1 202
225
BIT
45
добрый день

необходимо сделать импорт в указанную форму и в определенные поля из файла , например excel, в лотус агентом (по расписанию)
начала просто пробовать по кнопке.

Подскажите, пожалуйста если я такого вида код переделаю для агента - он будет нормальным, или лучше импорт с сервера запускать по другому?

Код:
Sub Initialize

    Dim xlFilename As String
    xlFilename = Inputbox$("Файл импорта по умолчанию.", "Файл для импорта Диск:\f2.XLS", "c:\f2.xls")
    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 number As Integer
    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 = 1
    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("view")'представление где после импорта отображаются созданные документы
        strName = xlCells( row, 1). Value
        Set doc = view.GetDocumentByKey(strName ,True)
        If doc Is Nothing Then
                Set doc = db.CreateDocument
                With doc
                        .Form = "form"
                        .a= xlCells(row, 1).Value
                        .a_1= xlCells( row, 2 ).Value
                        .a_2= xlCells(row,  3).Value
                End With
        Else
        End If
        Call doc.Save( True, True )
        Set doc = Nothing
        If written < number Then Goto Add
        excel.quit
        Dim ws As New NotesUIWorkspace
        Call ws.ViewRefresh
End Sub
Норм, код рабочий, ток на сервере не надо запускать эксель
 

Irina

Green Team
31.05.2019
145
2
BIT
0
а вот вопрос, как определить только заполненные ячейки в файле?
 

alexas1

Green Team
10.04.2014
1 202
225
BIT
45
а вот вопрос, как определить только заполненные ячейки в файле?
Внутри цикла (перебираются ячейки выбранной строки) конкатенировать содержимое всех ячеек строки и, если, этот результат "", выйти из цикла и последний док не сохранять.
Пустых строк, канеш, быть не должно внутри таблицы
Всякие эксельные штучки, типа iLastRow = Cells(Rows.Count,1).End(xlUp).Row гарантии правильного рез-та не дадут. Просто не должно быть пустых строк.
 
Последнее редактирование:

ToxaRat

Чёрный маг
Green Team
06.11.2007
3 332
42
BIT
0
number = Inputbox$("Введите количество строк", "Введите количество строк, содержащихся в импортируемом файле")
нормальный код - сервер найдёт чо ответить ;)
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
473
на сервере - уже постил
Java:
package com.setralubs;

import com.ibm.xsp.webapp.XspHttpServletResponse;
import com.poiji.annotation.ExcelCellName;
import com.poiji.bind.Poiji;
import com.poiji.exception.PoijiExcelType;
import com.poiji.option.PoijiOptions;
import com.poiji.option.PoijiOptions.PoijiOptionsBuilder;

import org.apache.commons.io.IOUtils;
import org.apache.poi.common.usermodel.HyperlinkType;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.usermodel.Hyperlink;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.*;
import java.net.HttpURLConnection;
import java.util.*;
import java.util.function.Supplier;
import java.util.logging.Level;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;

import org.openntf.domino.*;
import org.openntf.domino.utils.Factory;
import org.openntf.domino.xsp.XspOpenLogUtil;

public class BatchChecker {
    private final String classID="::"
            + new Throwable().getStackTrace()[0].getClassName() + "::";
    @ExcelCellName("Material")
    String fusion;

    @ExcelCellName("Material Description")
    String prodName_Pack;

    @ExcelCellName("Batch")
    String batch;

    @ExcelCellName("Production date (PRK)")
    String prodDateSAP;

    @ExcelCellName("Prod.date (Molcom)")
    String prodDateWH;

    private Session ses;

    private Database db;

    private View view;
    private PrintWriter opw;
    private OutputStream os;
    private ZipOutputStream append;
 
    public BatchChecker() {
        ses = Factory.getSession();
        db = ses.getCurrentDatabase();
        view = db.getView("batches");
    }

    public <T> List<T> checking(InputStream inStream, Class<T> type){
        List<T> ret=new ArrayList<T>();
        Throwable throwable = new Throwable();
        try{
            XspOpenLogUtil.logEvent(throwable, this.classID + "<-"
                    + throwable.getStackTrace()[1].getClassName() + "."
                    + throwable.getStackTrace()[1].getMethodName()
                    +": Loading", Level.INFO,
                    null);

            List<BatchChecker> list=Poiji.fromExcel(inStream, PoijiExcelType.XLSX, BatchChecker.class);
                    //new File("wh-report.xlsx"), BatchChecker.class);
            XspOpenLogUtil.logEvent(throwable, this.classID
                    + throwable.getStackTrace()[1].getMethodName()
                    +": Loading has completed", Level.INFO,
                    null);
            XspOpenLogUtil.logEvent(throwable, this.classID
                    + throwable.getStackTrace()[1].getMethodName()
                    +": Searching...", Level.INFO,
                    null);
            for(BatchChecker el:list){
                ViewEntry entry=view.getFirstEntryByKey(el.batch,true);
                if (entry!=null)
                    ret.add(type.cast(el.batch));
            }
            XspOpenLogUtil.logEvent(throwable, this.classID
                    + throwable.getStackTrace()[1].getMethodName()
                    +": Searching has completed", Level.INFO,
                    null);

        }catch(Exception e){
            e.printStackTrace();
            XspOpenLogUtil.logError(e);
        }
        return (List<T>)ret;
    }
 
    public void checking(InputStream is, PrintWriter os, boolean exists){
        Throwable throwable = new Throwable();
        if (os !=null){
            this.opw=os;
            //PoijiOptions options = PoijiOptionsBuilder.settings().sheetIndex(0).build();
            if (exists){
                XspOpenLogUtil.logEvent(throwable, this.classID
                        + throwable.getStackTrace()[1].getMethodName()
                        +": Creating list for existing batches...", Level.INFO,
                        null);
                Poiji.fromExcel(is, PoijiExcelType.XLSX, BatchChecker.class, this::dbCheck);//, options, this::dbCheck);
            }
            else{
                XspOpenLogUtil.logEvent(throwable, this.classID
                        + throwable.getStackTrace()[1].getMethodName()
                        +": Creating list for absent batches...", Level.INFO,
                        null);
                Poiji.fromExcel(is, PoijiExcelType.XLSX, BatchChecker.class, this::dbCheckNo);//, options, this::dbCheckNo);
            }
        }else{
            XspOpenLogUtil.logErrorEx(throwable, this.classID + "PrintWriter is null"
                    , Level.INFO, null);

        }
    }
 
    /**
     * process input and write result as zip to output
     */
    public int checking2ZIP(){
        Throwable throwable = new Throwable();
        int status=HttpURLConnection.HTTP_INTERNAL_ERROR;
        InputStream is=null;
        FacesContext fc = FacesContext.getCurrentInstance();
        ExternalContext ex = fc.getExternalContext();
        HttpServletRequest request = (HttpServletRequest) ex.getRequest();
        try {
            is=request.getInputStream();
            status=HttpURLConnection.HTTP_NOT_FOUND;
            if( is!=null
                    && request.getContentType()!=null
                    && request.getContentType().contains(
                    "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
                    )
            {
                XspHttpServletResponse xspResponse = (XspHttpServletResponse) ex.getResponse();
                javax.servlet.http.HttpServletResponse response=xspResponse.getDelegate();
                String type=MIMEType.get("zip");
                response.setHeader("Content-Type",type);
                response.setHeader("Content-Disposition","attachment; filename=allFiles.zip");

                this.os =response.getOutputStream();
                append = new ZipOutputStream(os);
                //PoijiOptions options = PoijiOptionsBuilder.settings().sheetIndex(0).build();
                Poiji.fromExcel(is, PoijiExcelType.XLSX, BatchChecker.class, this::add2Zip);//, options, this::dbCheck);
                append.finish();
                status=HttpURLConnection.HTTP_OK;
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            XspOpenLogUtil.logError(e);
        }
        return status;
    }

    private void add2Zip(BatchChecker instance){
        try{
            ViewEntry entry=view.getFirstEntryByKey(instance.batch,true);
            InputStream is=null;String fName=null;
            if (entry!=null){
                EmbeddedObject eo=entry.getDocument().getAttachments().get(0);
                if (eo!=null){
                    is=eo.getInputStream();
                    fName=eo.getName();
                }
            }
            if (is!=null) {
                ZipEntry e=new ZipEntry(fName);
                append.putNextEntry(e);
                long bc=IOUtils.copy(is, append);
                //e.setMethod(ZipEntry.STORED);
                //e.setCompressedSize(bc);
                //e.setSize(bc);
                //append.closeEntry();
                //is.close();
            }
        } catch (IOException e1) {
            e1.printStackTrace();
            //LOG.error("IO error",e1);
        }
    }

    private void dbCheck(BatchChecker instance){
        Throwable throwable = new Throwable();
        //System.out.println("check batch: "+instance.batch);
        if (view.getFirstEntryByKey(instance.batch,true)!=null){
            opw.write("="+instance.batch+";");
        }else{
            opw.write(instance.batch+";");
        }

    }
    private void dbCheckNo(BatchChecker instance){
        if (view.getFirstEntryByKey(instance.batch,true)==null){
            opw.write(instance.batch+";");
        }
    }
 
    ViewEntry getBatchEntry(String batch){
        return view.getFirstEntryByKey(batch,true);
    }
 
    static File createExcel(List<BatchChecker> list, String urlBase) throws IOException {
        File ret=File.createTempFile("out", ".xlsx");
        OutputStream os=new FileOutputStream(ret);
        Workbook wb= new XSSFWorkbook();
        Sheet sh=wb.createSheet("Batches");
        int i=0;
        for(BatchChecker el:list) {
            Row row=sh.createRow(i++);
            setCells(el, urlBase, row);
        }
        wb.write(os);
        wb.close();
        return ret;
    }
 
    private static void setCells(BatchChecker el, String urlBase, Row row){
        short cellIdx=0;
        Cell cell = row.createCell(cellIdx++);
        if (urlBase==null) {
            cell.setCellValue(el.batch);
            cell = row.createCell(cellIdx);
            cell.setCellValue(el.prodName_Pack);
        }else {
            cell.setCellValue(el.batch + ":" + el.prodName_Pack);
            Workbook wb = row.getSheet().getWorkbook();
            CellStyle hlink_style = wb.createCellStyle();
            Font hlink_font = wb.createFont();
            hlink_font.setUnderline(Font.U_SINGLE);
            hlink_font.setColor(HSSFColor.HSSFColorPredefined.DARK_BLUE.getIndex());
            hlink_style.setFont(hlink_font);
            CreationHelper creationHelper = wb.getCreationHelper();
            Hyperlink link = creationHelper.createHyperlink(HyperlinkType.URL);
            String url = urlBase + el.batch;
            link.setAddress(url);
            cell.setHyperlink(link);
            cell.setCellStyle(hlink_style);
        }
    }
    public int getBatch(String id){//, javax.servlet.http.HttpServletResponse response){
        int status=HttpURLConnection.HTTP_INTERNAL_ERROR;
        Throwable throwable = new Throwable();
        FacesContext fc = FacesContext.getCurrentInstance();
        ExternalContext ex = fc.getExternalContext();

        XspHttpServletResponse xspResponse = (XspHttpServletResponse) ex.getResponse();
        javax.servlet.http.HttpServletResponse response=xspResponse.getDelegate();

        if (id!=null && !id.isEmpty()){
            XspOpenLogUtil.logEvent(throwable, this.classID
                    + throwable.getStackTrace()[1].getMethodName()+"(): "
                    +"get first entry for: "+id, Level.INFO,
                    null);

            ViewEntry entry=getBatchEntry(id);
         
         
            //Document doc=db.getDocumentByUNID(id);
            if (entry!=null){
                List<org.openntf.domino.EmbeddedObject> atts=entry.getDocument().getAttachments();
                String fName=atts.get(0).getName();
                String type=MIMEType.get(fName.substring(fName.lastIndexOf(".")+1));

                //response.setContentType(type);
                response.setHeader("Content-Type",type);
                response.setHeader("Content-Disposition","attachment; filename="+fName);
/*                XspOpenLogUtil.logEvent(throwable, this.classID
                        + throwable.getStackTrace()[1].getMethodName()+"(): "
                        +"mime type: "+type+"\n"
                        +"attach name: "+atts.get(0).getName(), Level.INFO,
                        null);
*/
                //File tmp=obj.createExcel(obj.testCheckingBC(), "");
             
                try {
                    IOUtils.copy(atts.get(0).getInputStream(),response.getOutputStream());
                    status=HttpURLConnection.HTTP_OK;
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    XspOpenLogUtil.logError(e);
                }

            }else{
                String statusTxt="entry hasn't been found ";
                XspOpenLogUtil.logEvent(throwable, this.classID
                        + throwable.getStackTrace()[1].getMethodName()+"(): "
                        +statusTxt, Level.INFO,
                        null);
                status=HttpURLConnection.HTTP_NOT_FOUND;
                String type= "application/json; charset=UTF-8";
                response.setHeader("Content-Type",type);
                try {
                    xspResponse.getWriter().write("{\"error\":\""+statusTxt+"\"}");
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    XspOpenLogUtil.logError(e);
                }
            }
        }else{
            status=checking2ZIP();
        }
        return status;
    }

    public List<String> testChecking(){
        BatchChecker obj=new BatchChecker();
        return obj.checking(FacesContext.getCurrentInstance().getExternalContext().getResourceAsStream("wh-report.xlsx"),String.class);
    }
    public List<BatchChecker> testCheckingBC(){
        BatchChecker obj=new BatchChecker();
        return obj.checking(FacesContext.getCurrentInstance().getExternalContext().getResourceAsStream("wh-report.xlsx"),BatchChecker.class);
    }
    public void testCheckingOut(PrintWriter os){
        BatchChecker obj=new BatchChecker();
        obj.checking(FacesContext.getCurrentInstance().getExternalContext().getResourceAsStream("wh-report.xlsx"),os, true);
    }
 
    public static void main(String args[]){
        BatchChecker obj=new BatchChecker();
        obj.checking(FacesContext.getCurrentInstance().getExternalContext().getResourceAsStream("wh-report.xlsx"),String.class);
    }
}
этот класс сделан под обработку полей перечисленных с @ExcelCellName
обработка входного хухеля как стрима
вывод может быть в виде списка или зипа с найденными файлами (по ключу)
ничто не мешает делать запись в БД при dbCheck ;)
использует OpenNTF (и OpenNTFLog), POI, Poiji
делал вызов этого класса в хухеле (макрос), через КОМу http и получал список или архив (при получении списка делал ссылки на существующие доки)
 
Последнее редактирование:

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
473
по мотивам первого класса создавался класс записи в NAB из хухеля
Java:
package com.setralubs;

import com.poiji.annotation.ExcelCellName;
import com.poiji.bind.Poiji;
import com.poiji.exception.PoijiExcelType;
import static  com.setralubs.CommonLib.*;

import java.io.*;
import java.util.*;

import java.util.logging.Level;
import java.util.stream.Collectors;

import org.openntf.domino.*;
import org.openntf.domino.xsp.XspOpenLogUtil;

public class PersonNAB {
   
    private static final String NAB_IS_NOTHING = "NAB is Nothing";
    private static final String FULL_NAME_IS_EMPTY = "FullName column Is Empty";
    private static final String CREATE_PERSON = "Create person";
    static final String OPTION_NOTIFICATION_TEMPL="optNotificationTemplate";
    private final String classID="::"
            + new Throwable().getStackTrace()[0].getClassName() + "::";
    @ExcelCellName("MailSystem")
    public String MailSystem="5";//EXTERNAL MAIL
    @ExcelCellName(HTTP_PASSWORD)
    public String HTTPPassword="";
    @ExcelCellName(ALT_FULL_NAME_SORT)
    public String AltFullNameSort;
    @ExcelCellName(FULL_NAME)
    public String FullName="";
    @ExcelCellName("LastName")
    public String LastName="";
    @ExcelCellName(INTERNET_ADDRESS)
    public String InternetAddress="";
    @ExcelCellName("Comment")
    public String Comment="";
   
    private List<PersonNAB> succeed=null;
    private Map<String, List<PersonNAB>> errs=null;
    private Map<String, String> flds=null;
    private int rowCnt=0;
    private int cntEmpty=0;
    private Database nab;
    private Document templDoc;
   
    public List<String> processing(InputStream is, PrintWriter os){
        Throwable throwable = new Throwable();
        XspOpenLogUtil.logEvent(throwable, this.classID
                + throwable.getStackTrace()[0].getMethodName()
                +": creating person records...\nclass fileds:"+String.valueOf(CommonLib.fieldsAsMap(this, true)), Level.INFO,
                null);
        succeed=new ArrayList<>();
        nab = CommonLib.getNABConfigDB();
        errs=new HashMap<>();
        templDoc = CommonLib.getOptionDoc(OPTION_NOTIFICATION_TEMPL);
        if (nab!=null){
            Poiji.fromExcel(is, PoijiExcelType.XLSX, PersonNAB.class, this::nabProc);
            XspOpenLogUtil.logEvent(throwable, this.classID
                    + throwable.getStackTrace()[0].getMethodName()
                    +": " + succeed.size() +" person records have created", Level.INFO,
                    null);
   
            if (!succeed.isEmpty()){
                List<String> groups=CommonLib.getNABConfigDoc().getItemValues(CommonLib.GROUPS_FLD, String.class);
                List<String> list=succeed.stream().map(m->m.FullName).collect(Collectors.toList());
                CommonLib.addMembers2Group(list, groups);
            }else{
            }
        }else{
            errs.put(NAB_IS_NOTHING, null);
        }
        final String sCntEmpty=String.valueOf(cntEmpty);
        if (cntEmpty>0) this.errs.put(FULL_NAME_IS_EMPTY, null);
       
        List<String> list = errs.entrySet().stream()
                .map(e->{
                    switch (e.getKey()){
                    case FULL_NAME_IS_EMPTY:
                        return FULL_NAME_IS_EMPTY+" - "+sCntEmpty;
                    case NAB_IS_NOTHING:
                        return NAB_IS_NOTHING;
                    default:
                            return e.getKey()
                                    +((e.getValue()==null)?
                                            ": -- null person"
                                        : ":"
                                        +e.getValue().stream()
                                            .map(v->
                                                v.FullName==null?"-- null FullName":v.FullName)
                                            .collect(Collectors.joining("\n")
                                    ));
                    }
                })
                .collect(Collectors.toList());
                list.addAll(succeed.stream()
                        .map(p->
                        p.AltFullNameSort + ":" + p.FullName + ":" +p.HTTPPassword
                    )
                    .collect(Collectors.toList())
                );
                return list;
    }
   
    private void nabProc(PersonNAB instance){
        this.rowCnt++;
        if (instance.FullName!=null && !instance.FullName.isEmpty()){
            if (instance.MailSystem==null || instance.MailSystem.isEmpty())instance.MailSystem=PersonFieldsNAB.EXTERNAL_MAIL;
            if (instance.HTTPPassword==null || instance.HTTPPassword.isEmpty())instance.HTTPPassword=CommonLib.genPassword(8);
            if (instance.LastName==null || instance.LastName.isEmpty())instance.LastName=instance.FullName;
            if (instance.Comment==null)instance.Comment="";
            if (instance.InternetAddress.contains(";")){
                instance.Comment+="\ne-mail: "+instance.InternetAddress;
                instance.InternetAddress=instance.InternetAddress.split(";", -1)[0];
            }
            Map<String, Object> fieldsAsMap = CommonLib.fieldsAsMap(instance, true);
            Document docPerson=CommonLib.createPersonNAB(nab, fieldsAsMap);
            if (docPerson !=null){
                this.succeed.add(instance);
                ClientInfo clInf= new ClientInfo(fieldsAsMap);
                clInf.appendBody(templDoc);
            }else{
                List<PersonNAB> list=this.errs.get(CREATE_PERSON);
                if (list ==null){
                    list=new ArrayList<>();
                }
                list.add(instance);
            }
        }else{
            this.cntEmpty++;
        }
    }
}
если выкинуть OpenNTF - получится достаточно компактный код обработки:
-класс с нужными полями с аннотациями
-логика распихивания в БД в ф-ции calback (а данном случае nabProc)
 
Последнее редактирование:

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
473
Set Excel = CreateObject("excel.application") Excel.Visible = False
If written < number Then Goto Add excel.quit
"замечательные" шансы для "выстрела себе в ногу". Получение эксепшена в коде или прерывание скрипта и мы имеет объект в памяти и залоченный файл на диске ;)
 

alexas1

Green Team
10.04.2014
1 202
225
BIT
45
если проверка на ключевое поле - понятно..., но там надо знать еще - где ключевая колонка ;)
в коде, кот. привел я - ключевая колонка по имени
Ну, по разному можно, ток всирано таблица обязана быть хоть в чем то шаблонизирована, на что можно опирацца.
 

VladSh

начинающий
Lotus Team
11.12.2009
1 797
158
BIT
233
Всё проще гораздо. Доки экспортим в csv, а Excel элементарно его открывает.
 

VladSh

начинающий
Lotus Team
11.12.2009
1 797
158
BIT
233
@alexas1
Ну ладно, ладно!)

> необходимо сделать импорт в указанную форму и в определенные поля из файла , например excel
"например Excel" для меня говорит о том, что это не принципиально, а возможно именно сейчас обсуждается. Можно предложить csv, который проще прочитать и разобрать. А можно json.
Я за JSON, т.к. когда-то они смогут не ложить файлы на сервер, а культурно отправлять их web-сервису, то код по разбору и использованию json будет уже написан.
 

alexas1

Green Team
10.04.2014
1 202
225
BIT
45
@alexas1
Ну ладно, ладно!)

> необходимо сделать импорт в указанную форму и в определенные поля из файла , например excel
"например Excel" для меня говорит о том, что это не принципиально, а возможно именно сейчас обсуждается. Можно предложить csv, который проще прочитать и разобрать. А можно json.
Я за JSON, т.к. когда-то они смогут не ложить файлы на сервер, а культурно отправлять их web-сервису, то код по разбору и использованию json будет уже написан.
Принципиальная неприятность - иметь excel на тачке, нинравицца) POI сквозь xpage - фарева. Тут было, и lmike решение давал, норм рабочее)
 
Мы в соцсетях:

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