Про excel, word...

Тема в разделе "Lotus - Программирование", создана пользователем lmike, 14 фев 2011.

  1. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    т.к. тема специфична разделу LS2J, пост разместил там, но, возможно, интересно будет и в общих задачах ;)
    http://codeby.net/forum/threads/41201.html
     
  2. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    добавляю "тонкости" всякие, начиная с поста
     
  3. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
  4. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    хотелось бы вопросов, каментов...
    ну вощем - обратной связи
    чего понятно, чего - нет, что получается/не получается
     
  5. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    сам отпишусь :(
    мне сказали, что хехель ругаецо на файл (открывае, но ругаецо)
    это связано со строками
    Код (Text):
    '   openXLSObj.getWorkSheet(0).freezeRow(1) 'might be name error
    openXLSObj.getWorkSheet(0).freezeCol(1) 'will freeze Row! but provide error message (in Excel)
    закоментив заморозку - избавимся от ругани
    видать в либе это криво реализовано (даже названия напутали)
     
  6. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    обновил БД http://codeby.net/forum/threads/41201.html?vi...st&p=205046
    будут вопросы - спрашивайте, т.к. описание старое, а изменений много
    видимые изменения коснулись формы импорта (выбор файлов)
     
  7. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    некоторые "допиливания" в БД, версия 1.0.4b
    на способность работать с "внешней" базой не проверял (хотя такое подразумевается)
     
  8. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    готовлю фичи...
    составной ключ - возможность отслеживания уникальности по нескольким колонкам хехеля (сейчас тока одна)
    загрузка мёрженых строк (в колонках) - попадут в один док (сейчас - каждая строка - один док), если строки одной колонки смёржены - несмердженые будут как мультивэлью поле, в доке
     
  9. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    обнаружил пару моментов при конвертации:
    -float в ячейке дает short, через бридж - надо получать через getDoubleVal
    -формулы вычислять надо в стринг а потом парсить в дабл (если надо число)
    все эти моменты уже есть в коде
    ключ для чисел "приводится" к целому (не вижу смысла бороться с округлениями)
     
  10. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    выложил, с заявленными изменениями - 1.0.5b
     
  11. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    изменения для работы с мультивэлью в полях - 1.0.6b
     
  12. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    хочу пояснить, более явно :newconfus:, для чего можно использовать эту базу (в конечном счете - набор библиотек и логики)...

    в клиенте Нотус есть File-Import этот инструмент выполняет свои задачи, но есть желание достичь управляемости:
    -контроль типа полей
    -отслеживание уникальности записей
    -мультивэлью поля
    -объединение строк
    -"одновременная" загрузка нескольких файлов
    -загрузка по нескольким формам, из одного файла
    ...
    вышеперечисленные задачи, решены (полностью или частично), в указанной базе
     
  13. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    нахожусь в нек. задумчивости...
    используемая либа OpenXLS 6.06 вполне работает на загрузку (чтение из файла)
    но как "оказалось" делает что-то "не так" при выгрузке, созданные файлы открываются (хотя нужно шаманство с высотой строк) и в ОО и в ЛО и в МСО2003..., а вот МСО2007-2010 считают их "убитыми)
    есть POI, кот. меня привлекает универсальностью (могет читать/писать всю МСхрень), но свежие либы только под 1.5+ жвм
    удастся ли задействовать (не меняя интерфейса для обращения) ранние версии POI (3.2) , кот. допускают жвм 1.4 - не знаю
    забить на 7-ку домины пока не могу
    вощем - буду посмотреть
     
  14. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
  15. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
  16. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    набросал новый интерфейс обсчения для импорта, через POI...
    пока тестю :)
    когда выложу готовый экзампел - не могу сказать, планируемые фичи:
    • обработка связки parent->child, где увязываются две "конфигурации"
      <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">"экзампел"</div></div><div class="sp-body"><div class="sp-content">
      Код (Text):
          Dim path As String, conf As String, confChild As String
      path={D:\Documents\tmp\loan1.xlsm}
      conf={Клиенты}
      confChild={Платежи}
      Dim config As New Config
      Dim ioconf As New IOConfig(config, conf, path)
      Dim ioconfChild As New IOConfig(config, confChild, path)
      Set ioconf.Childs=ioconfChild
      Call ioconf.Process()
    • переход на Rules шаблон, для обработки опций, для полей (в прежнем варианте - нахардкодено), полный шаблон не рализовывал ;) (за ненадобностью)
    • более четкое выделение обработки типов полей (прежний вариант был замуторный)
    • понабаянил всяких классов (уход от процедурного вида) и разделение по зонам ответственности, сделана некая композиция, где контроллером будет IOConfig
    Ограничения LS2J, к кот. подошел - невозможность калбэков, кот. нужны для реализации eventmodel, что необходимо для больших файлов (там SAX, но с обертками POI)
    см. схемку ss_features_hssf_xssf_sxssf_.png
    вариант - подавать ссылку на Variant , кот. заполняется из java (String[]), и с типизацией (итератор для получения соответ. значения по строке и колонке)
     
  17. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    подумал и решил :)
    схема действий будет такая (для больших файлов):
    -java код маньячит файло в CSV (кучка отдельных файлов по шитам)
    -файлов на шит - 2-а собсно CSV с данными, второй - с рефами по ячейкам
    -CSV обрабатываем в LS, произвольный доступ лепить лень - последовательно по строкам будет. Можно, конечно, от'индексить, в java, для строк, в массив выплюнуть (наряду со списком файлов)
    код взял отседова немного"допилил"
    Код (Java):
    import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
    import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
    import org.apache.poi.openxml4j.opc.OPCPackage;
    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.xml.sax.ContentHandler;
    import org.xml.sax.InputSource;
    import org.xml.sax.SAXException;
    import org.xml.sax.XMLReader;
     
    import javax.xml.parsers.ParserConfigurationException;
    import javax.xml.parsers.SAXParser;
    import javax.xml.parsers.SAXParserFactory;
    import java.io.*;
     
    /**
    * Created by mike on 28.07.14.
    */

    public class POI2CSV {
    private final char SEP=';';
    private class CSVmap {
    private BufferedWriter osCSV;
    private BufferedWriter osMAP;
    public CSVmap(String xName) throws IOException {
    osCSV= new BufferedWriter(new FileWriter(xName + ".csv"));
    osMAP= new BufferedWriter(new FileWriter(xName + "_map" + ".csv"));
    }
    public void close() throws IOException {
    osCSV.close();
    osMAP.close();
    }
    public void write(String cellReference, String formattedValue) throws IOException {
    //          System.out.println(cellReference+SEP);
    osMAP.write(cellReference + SEP);
    osCSV.write(formattedValue + SEP);
    }
     
    public void newLine() throws IOException {
    osMAP.newLine();
    osCSV.newLine();
    }
    }
    public void parseExcel(File file) throws IOException {
     
    OPCPackage container;
    try {
    container = OPCPackage.open(file.getAbsolutePath());
    ReadOnlySharedStringsTable strings = new ReadOnlySharedStringsTable(container);
    XSSFReader xssfReader = new XSSFReader(container);
    StylesTable styles = xssfReader.getStylesTable();
    XSSFReader.SheetIterator iter = (XSSFReader.SheetIterator) xssfReader.getSheetsData();
    while (iter.hasNext()) {
    InputStream stream = iter.next();
    //file.getName()+'_'+iter.getSheetName()
    CSVmap csvmap=new CSVmap(file.getName()+'_'+iter.getSheetName());
    processSheet(styles, strings, stream, csvmap);
    stream.close();
    csvmap.close();
    }
    } catch (InvalidFormatException e) {
    e.printStackTrace();
    } catch (SAXException e) {
    e.printStackTrace();
    } catch (OpenXML4JException e) {
    e.printStackTrace();
    }
     
    }
     
    protected void processSheet(StylesTable styles, ReadOnlySharedStringsTable strings, InputStream sheetInputStream, final CSVmap csvmap) throws IOException, SAXException {
     
    InputSource sheetSource = new InputSource(sheetInputStream);
    SAXParserFactory saxFactory = SAXParserFactory.newInstance();
    try {
    SAXParser saxParser = saxFactory.newSAXParser();
    XMLReader sheetParser = saxParser.getXMLReader();
    ContentHandler handler = new XSSFSheetXMLHandler(styles, strings, new XSSFSheetXMLHandler.SheetContentsHandler() {
     
    @Override
    public void startRow(int rowNum) {
    }
    @Override
    public void endRow() {
    try {
    csvmap.newLine();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    @Override
    public void cell(String cellReference, String formattedValue) {
    try {
    csvmap.write(cellReference, formattedValue);
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    @Override
    public void headerFooter(String text, boolean isHeader, String tagName) {
     
    }
     
    },
    false//means result instead of formula
    );
    sheetParser.setContentHandler(handler);
    sheetParser.parse(sheetSource);
    } catch (ParserConfigurationException e) {
    throw new RuntimeException("SAX parser appears to be broken - " + e.getMessage());}
    }
     
    public static void main(String args[]){
    POI2CSV inst=new POI2CSV();
    try {
    System.out.println(args[0]);
    inst.parseExcel(new File(args[0]));
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }
    150 шитов отманьячил влегкую
    xlsx 8 метров, если делать в память (по предыдущему пути) - мрет на 20 шитах (при том что jvm-у 512M памяти)
     
    #17 lmike, 28 июл 2014
    Последнее редактирование модератором: 25 мар 2016
  18. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    новый код, по мотивам граблей "LS2J"
    Код (LotusScript):
    %REM
    *********************************************
    Class XLSXSAX
    Description: Comments for Class
    %END REM

    Class XLSXSAX As ErrorHandlerWJ
    Private POI2CSV As Javaclass
    Private csvobj As Javaobject
    Private sPath As String
    %REM
    *--------------------------------------------
    Sub New
    Description: Comments for Sub
    %END REM

    Sub New(xName As String)
    Dim routineName As String
    routineName="New"
    On Error GoTo ErrH
    'your code here
    Set me.POI2CSV=jSession.Getclass({POI2CSV})
    Set me.csvobj=me.POI2CSV.Createobject()
    me.sPath=xName
    Quit:
    Exit Sub
    ErrH:
    Error Err, RaiseError
    Resume Quit
    End Sub
    %REM
    *--------------------------------------------
    Function Process
    Description: Comments for Function
    %END REM

    Function Process
    Dim routineName As String
    routineName="Process"
    On Error GoTo ErrH
    'your code here
    Dim File, FileObj
    Set File = jSession.GetClass({java/io/File})
    Set FileObj= File.CreateObject({(Ljava/lang/String;)V}, me.sPath)
    me.csvobj.parseExcel(FileObj)
    '   Process=
    Quit:
    Exit Function
    ErrH:
    Error Err, RaiseError
    Resume Quit
    End Function
    %REM
    *--------------------------------------------
    Property Get arrPosMap
    Description: Comments for Property Get
    xName должно соответ. эленмету массива из
    ArrPathMap
    %END REM

    Property Get ArrMap(xName As String) As Variant
    Dim routineName As String
    routineName="arrPosMap"
    On Error GoTo ErrH
    'your code here
    ArrMap=me.csvobj.getArrMap(xName)
    Quit:
    Exit Property
    ErrH:
    Error Err, RaiseError
    Resume Quit
    End Property
    %REM
    *--------------------------------------------
    Property Get arrPathMap
    Description: Comments for Property Get
    %END REM

    Property Get ArrPathMap
    Dim routineName As String
    routineName="arrPathMap"
    On Error GoTo ErrH
    'your code here
    ArrPathMap=me.csvobj.getArrPathMap()
    Quit:
    Exit Property
    ErrH:
    Error Err, RaiseError
    Resume Quit
    End Property
    End Class
    "java POI с SAX"
    Код (Java):
    import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
    import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
    import org.apache.poi.openxml4j.opc.OPCPackage;
    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.xml.sax.ContentHandler;
    import org.xml.sax.InputSource;
    import org.xml.sax.SAXException;
    import org.xml.sax.XMLReader;
     
    import javax.xml.parsers.ParserConfigurationException;
    import javax.xml.parsers.SAXParser;
    import javax.xml.parsers.SAXParserFactory;
    import java.io.*;
    import java.util.*;
     
    /**
    * Created by mike on 28.07.14.
    */

    public class POI2CSV {
    private final String encoding="UTF-8";
    private final Map<String,List<Integer>> arrPathCSV = new HashMap<String,List<Integer>>();
    private final Map<String,List<Integer>> arrPathMap = new HashMap<String,List<Integer>>();
     
    private class CSVmap {
    private BufferedWriter osCSV;
    private BufferedWriter osMAP;
    private final File tempcsv;
    private final File tempmap;
     
    public CSVmap(String xName) throws IOException {
    xName=xName.replaceAll("\"","");
    tempcsv = File.createTempFile(xName, ".csv");
    tempmap = File.createTempFile(xName, ".map");
    osCSV= new BufferedWriter(new OutputStreamWriter(new FileOutputStream(tempcsv),encoding));
    osMAP= new BufferedWriter(new OutputStreamWriter(new FileOutputStream(tempmap), encoding));
    }
     
    public void close() throws IOException {
    osCSV.close();
    osMAP.close();
    }
     
    public void write(String cellReference, String formattedValue) throws IOException {
    //          System.out.println(cellReference+SEP);
    char SEP = ';';
    osMAP.write(cellReference + SEP);
    osCSV.write(formattedValue + SEP);
    }
     
    public void newLine() throws IOException {
    osMAP.newLine();
    osCSV.newLine();
    }
     
    public String getTempcsv() {
    return tempcsv.getAbsolutePath();
    }
     
    public String getTempmap() {
    return tempmap.getAbsolutePath();
    }
     
    }
    public void parseExcel(File file) throws IOException {
     
    OPCPackage container;
    try {
    container = OPCPackage.open(file.getAbsolutePath());
    ReadOnlySharedStringsTable strings = new ReadOnlySharedStringsTable(container);
    XSSFReader xssfReader = new XSSFReader(container);
    StylesTable styles = xssfReader.getStylesTable();
    XSSFReader.SheetIterator iter = (XSSFReader.SheetIterator) xssfReader.getSheetsData();
    while (iter.hasNext()) {
    InputStream stream = iter.next();
    //file.getName()+'_'+iter.getSheetName()
    CSVmap csvmap=new CSVmap(file.getName()+'_'+iter.getSheetName());
    processSheet(styles, strings, stream, csvmap);
    stream.close();
    csvmap.close();
    }
    } catch (InvalidFormatException e) {
    e.printStackTrace();
    } catch (SAXException e) {
    e.printStackTrace();
    } catch (OpenXML4JException e) {
    e.printStackTrace();
    }
     
    }
     
    protected void processSheet(StylesTable styles, ReadOnlySharedStringsTable strings, InputStream sheetInputStream, final CSVmap csvmap) throws IOException, SAXException {
    //duplicate for size in newLine
    String lineSeparator = java.security.AccessController.doPrivileged(
    new sun.security.action.GetPropertyAction("line.separator"));
    //length in bytes for default encoding, suppose UTF-8
    final int lnsepLen=lineSeparator.getBytes(encoding).length;
    final int sepLen=1;
    InputSource sheetSource = new InputSource(sheetInputStream);
    SAXParserFactory saxFactory = SAXParserFactory.newInstance();
    final List <Integer> arrmap=new ArrayList<Integer>(100);
    final List<Integer> arrdata=new ArrayList<Integer>(100);
    arrPathMap.put(csvmap.getTempmap(), arrmap);arrPathCSV.put(csvmap.getTempcsv(), arrdata);
     
    try {
    SAXParser saxParser = saxFactory.newSAXParser();
    XMLReader sheetParser = saxParser.getXMLReader();
    ContentHandler handler = new XSSFSheetXMLHandler(styles, strings, new XSSFSheetXMLHandler.SheetContentsHandler() {
    int idx =0;//only one index for arrmap, arrdata
     
    public void startRow(int rowNum) {
    arrmap.add(0);arrdata.add(0);
    idx =arrmap.size()-1;
    }
    public void endRow() {
    try {
    csvmap.newLine();
    arrmap.set(idx,arrmap.get(idx) + lnsepLen);
    arrdata.set(idx,arrdata.get(idx) + lnsepLen);
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    public void cell(String cellReference, String formattedValue) {
    try {
    csvmap.write(cellReference, formattedValue);
    //set data length for arrays
    arrmap.set(idx,arrmap.get(idx) + cellReference.getBytes(encoding).length + sepLen);
    arrdata.set(idx,arrdata.get(idx) + formattedValue.getBytes(encoding).length + sepLen);
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    public void headerFooter(String text, boolean isHeader, String tagName) {
     
    }
     
    },
    false//means result instead of formula
    );
    sheetParser.setContentHandler(handler);
    sheetParser.parse(sheetSource);
    } catch (ParserConfigurationException e) {
    throw new RuntimeException("SAX parser appears to be broken - " + e.getMessage());}
    }
     
    public Integer[] getArrMap(String key){
    /*      int[] ret= new int[arrmap.size()];
    int i = 0;
    for (Integer e : arrmap)
    ret[i++] = e;
    return ret;
     
    */

    List <Integer> arr=arrPathMap.get(key);
    return arr.toArray(new Integer[0]);
    }
     
    public Integer[] getArrData(String key){
    List <Integer> arr=arrPathCSV.get(key);
    return arr.toArray(new Integer[0]);
    }
     
    public String[] getArrPathCSV() {
    Set<String> keys=arrPathCSV.keySet();
    return keys.toArray(new String[0]);
    }
     
    public String[] getArrPathMap() {
    Set<String> keys=arrPathMap.keySet();
    return keys.toArray(new String[0]);
    }
     
    public static void main(String args[]){
    POI2CSV inst=new POI2CSV();
    try {
    System.out.println(args[0]);
    inst.parseExcel(new File(args[0]));
    String[] mappath=inst.getArrPathMap();
    String[] csvpath=inst.getArrPathCSV();
    inst.getArrMap(mappath[0]);Integer[] test=inst.getArrData(csvpath[0]);
    System.out.println(csvpath[0]);
    System.out.println(test[0]);
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }
    агент:
    Код (LotusScript):
    %REM
    *********************************************
    Agent test\1-SAX
    Created Jul 29, 2014 by Mikhail Cholokov/CRUINTERNET
    Description: Comments for Agent
    %END REM

    Option Public
    Option Declare
    Use "POI-Wrapper"
    Sub Initialize
    On Error GoTo ErrH
    Dim csv As New XLSXSAX({D:/Documents/tmp/loan1.xlsm})
    Call csv.Process()
    Dim arrpath
    arrpath=csv.arrPathMap()
    Print {file for element #2:} &CStr(arrpath(2))
    Dim arr As Variant
    arr=csv.ArrMap(arrpath(2))
    Print {pos for element #0:} &CStr(arr(0).intValue())
    Quit:
    Exit Sub
    ErrH:
    Error Err, RaiseError
    Resume Quit  
    End Sub
     
    #18 lmike, 30 июл 2014
    Последнее редактирование модератором: 25 мар 2016
  19. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    доработки по граблям, на этот раз поставлено ограничение в процессоре до 10 пустых строк, потому как иначе, на нек. шитах, кол-во строк может оказаться 65тыс. (при реальных 85)
    щ=[code class=java]import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
    import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
    import org.apache.poi.openxml4j.opc.OPCPackage;
    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.xml.sax.ContentHandler;
    import org.xml.sax.InputSource;
    import org.xml.sax.SAXException;
    import org.xml.sax.XMLReader;

    import javax.xml.parsers.ParserConfigurationException;
    import javax.xml.parsers.SAXParser;
    import javax.xml.parsers.SAXParserFactory;
    import java.io.*;
    import java.util.*;

    /**
    * Created by mike on 28.07.14.
    */
    public class POI2CSV {
    private final String encoding="UTF-8";
    private final Map<String,List<Integer>> arrPathCSV = new HashMap<String,List<Integer>>();
    private final Map<String,List<Integer>> arrPathMap = new HashMap<String,List<Integer>>();
    private final int BLANK_LIM=10;//limit for blank rows, skip other data (stop additions to corresponding List)
    private class CSVmap {
    private BufferedWriter osCSV;
    private BufferedWriter osMAP;
    private final File tempcsv;
    private final File tempmap;

    public CSVmap(String xName) throws IOException {
    xName=xName.replaceAll("\"","");
    tempcsv = File.createTempFile(xName, ".csv");
    tempmap = File.createTempFile(xName, ".map");
    osCSV= new BufferedWriter(new OutputStreamWriter(new FileOutputStream(tempcsv),encoding));
    osMAP= new BufferedWriter(new OutputStreamWriter(new FileOutputStream(tempmap), encoding));
    }

    public void close() throws IOException {
    osCSV.close();
    osMAP.close();
    }

    public void write(String cellReference, String formattedValue) throws IOException {
    // System.out.println(cellReference+SEP);
    char SEP = ';';
    osMAP.write(cellReference + SEP);
    osCSV.write(formattedValue + SEP);
    }

    public void newLine() throws IOException {
    osMAP.newLine();
    osCSV.newLine();
    }

    public String getTempcsv() {
    return tempcsv.getAbsolutePath();
    }

    public String getTempmap() {
    return tempmap.getAbsolutePath();
    }

    }
    public void parseExcel(File file) throws IOException {

    OPCPackage container;
    try {
    container = OPCPackage.open(file.getAbsolutePath());
    ReadOnlySharedStringsTable strings = new ReadOnlySharedStringsTable(container);
    XSSFReader xssfReader = new XSSFReader(container);
    StylesTable styles = xssfReader.getStylesTable();
    XSSFReader.SheetIterator iter = (XSSFReader.SheetIterator) xssfReader.getSheetsData();
    while (iter.hasNext()) {
    InputStream stream = iter.next();
    //file.getName()+'_'+iter.getSheetName()
    CSVmap csvmap=new CSVmap(file.getName()+'_'+iter.getSheetName());
    processSheet(styles, strings, stream, csvmap);
    stream.close();
    csvmap.close();
    }
    } catch (InvalidFormatException e) {
    e.printStackTrace();
    } catch (SAXException e) {
    e.printStackTrace();
    } catch (OpenXML4JException e) {
    e.printStackTrace();
    }

    }

    protected void processSheet(StylesTable styles, ReadOnlySharedStringsTable strings, InputStream sheetInputStream, final CSVmap csvmap) throws IOException, SAXException {
    //duplicate for size in newLine
    String lineSeparator = java.security.AccessController.doPrivileged(
    new sun.security.action.GetPropertyAction("line.separator"));
    //length in bytes for default encoding, suppose UTF-8
    final int lnsepLen=lineSeparator.getBytes(encoding).length;
    final int sepLen=1;
    InputSource sheetSource = new InputSource(sheetInputStream);
    SAXParserFactory saxFactory = SAXParserFactory.newInstance();
    final List <Integer> arrmap=new ArrayList<Integer>();
    final List<Integer> arrdata=new ArrayList<Integer>();
    arrPathMap.put(csvmap.getTempmap(), arrmap);arrPathCSV.put(csvmap.getTempcsv(), arrdata);

    try {
    SAXParser saxParser = saxFactory.newSAXParser();
    XMLReader sheetParser = saxParser.getXMLReader();
    ContentHandler handler = new XSSFSheetXMLHandler(styles, strings, new XSSFSheetXMLHandler.SheetContentsHandler() {
    int idx =0;//only one index for arrmap, arrdata
    int blankcnt=0;//see BLANK_CNT

    public void startRow(int rowNum) {
    if (blankcnt>BLANK_LIM) return;
    arrmap.add(0);arrdata.add(0);
    idx =arrmap.size()-1;
    }

    public void endRow() {
    try {
    if (blankcnt>BLANK_LIM) return;
    csvmap.newLine();
    if (arrmap.get(idx)<=sepLen) {
    blankcnt++;}
    else{blankcnt=0;} //check only one array (as array sizes are equal)
    arrmap.set(idx,arrmap.get(idx) + lnsepLen);
    arrdata.set(idx,arrdata.get(idx) + lnsepLen);
    } catch (IOException e) {
    e.printStackTrace();
    }
    }

    public void cell(String cellReference, String formattedValue) {
    if (blankcnt>BLANK_LIM) return;
    try {
    csvmap.write(cellReference, formattedValue);
    //set data length for arrays
    arrmap.set(idx,arrmap.get(idx) + cellReference.getBytes(encoding).length + sepLen);
    arrdata.set(idx,arrdata.get(idx) + formattedValue.getBytes(encoding).length + sepLen);
    } catch (IOException e) {
    e.printStackTrace();
    }
    }

    public void headerFooter(String text, boolean isHeader, String tagName) {

    }

    },
    false//means result instead of formula
    );
    sheetParser.setContentHandler(handler);
    sheetParser.parse(sheetSource);
    // System.out.println("arrmap size:" + arrmap.size()+";->" +csvmap.getTempmap());
    } catch (ParserConfigurationException e) {
    throw new RuntimeException("SAX parser appears to be broken - " + e.getMessage());}
    }

    public Integer[] getArrMap(String key){
    /* int[] ret= new int[arrmap.size()];
    int i = 0;
    for (Integer e : arrmap)
    ret[i++] = e;
    return ret;

    */
    List<Integer> arr=arrPathMap.get(key);
    System.out.println("map index size:" + arr.size());
    return arr.toArray(new Integer[0]);
    }

    public Integer[] getArrData(String key){
    List <Integer> arr=arrPathCSV.get(key);
    System.out.println("csv index size:"+arr.size());
    return arr.toArray(new Integer[0]);
    }

    public String[] getArrPathCSV() {
    Set<String> keys=arrPathCSV.keySet();
    List<String> forsort=new ArrayList<String>(keys);
    java.util.Collections.sort(forsort);
    return forsort.toArray(new String[0]);
    }

    public String[] getArrPathMap() {
    Set<String> keys=arrPathMap.keySet();
    List<String> forsort=new ArrayList<String>(keys);
    java.util.Collections.sort(forsort);
    return forsort.toArray(new String[0]);
    }

    public static void main(String args[]){
    POI2CSV inst=new POI2CSV();
    try {
    System.out.println(args[0]);
    inst.parseExcel(new File(args[0]));
    String[] mappath=inst.getArrPathMap();
    String[] csvpath=inst.getArrPathCSV();
    int idx=0;
    Integer[] testmap=inst.getArrMap(mappath[idx]);Integer[] test=inst.getArrData(csvpath[idx]);
    System.out.println(csvpath[idx]);
    System.out.println(mappath[idx]+"; array size:" + mappath.length);
    System.out.println(test[0] + "; array size:" + test.length);
    System.out.println(testmap[0] + "; array size:" + testmap.length);

    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }[/CODE]
     
    #19 lmike, 31 июл 2014
    Последнее редактирование модератором: 17 апр 2015
  20. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    POC агент (измененный код)
    Код (LotusScript):
        Dim ses As New NotesSession
    On Error GoTo ErrH
    Dim csv As New XLSXSAX({D:/Documents/tmp/loan.xlsx})
    Call csv.Process()
    Dim arrpath,arrpathcsv, idx As Integer
    idx=2
    arrpath=csv.arrPathMap()
    arrpathcsv=csv.ArrPathCSV()
    Print {map file for element #2:} &CStr(arrpath(idx))
    Print {csv file for element #2:} &CStr(arrpathcsv(idx))
    Dim arrmap,arrdata
    arrmap=csv.ArrMap(arrpath(idx))
    Print {pos for element #0:} &CStr(arrmap(0).intValue())
    Dim stream As NotesStream
    Set stream=ses.Createstream()
    Call stream.Open(arrpath(idx),{UTF-8})
    stream.Position=arrmap(0).intValue()
    Dim st As String
    st=StrLeftBack(stream.ReadText(STMREAD_LINE), {;})
    Print {cell ref arrays for 2-nd row>} &st
    'для гарантированного сброса файловых буферов
    Delete stream:Delete csv
    'удаляем файлы
    ForAll fmap In arrpath
    Kill fmap
    End ForAll
    ForAll fcsv In arrpathcsv
    Kill fcsv
    End ForAll
    Quit:
    Exit Sub
    ErrH:
    Error Err, RaiseError
    Resume Quit
    Добавлено: замечу, что для правильного доступа к массивам файлов, они отсортированы (иначе - хэш будет произвольно сортирован и не совпадать для map и csv)
     
Загрузка...
Похожие Темы - Про excel word
  1. lmike
    Ответов:
    68
    Просмотров:
    20.526
  2. RzvCH
    Ответов:
    3
    Просмотров:
    906
  3. Zoger
    Ответов:
    2
    Просмотров:
    1.738
  4. pbnoob
    Ответов:
    1
    Просмотров:
    1.937
  5. egkalinichenko
    Ответов:
    0
    Просмотров:
    1.273

Поделиться этой страницей