• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Про excel, word...

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 933
609
BIT
177
т.к. тема специфична разделу LS2J, пост разместил там, но, возможно, интересно будет и в общих задачах ;)
https://codeby.net/threads/41201.html
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 933
609
BIT
177
добавляю "тонкости" всякие, начиная с поста
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 933
609
BIT
177
хотелось бы вопросов, каментов...
ну вощем - обратной связи
чего понятно, чего - нет, что получается/не получается
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 933
609
BIT
177
сам отпишусь :(
мне сказали, что хехель ругаецо на файл (открывае, но ругаецо)
это связано со строками
Код:
'	openXLSObj.getWorkSheet(0).freezeRow(1) 'might be name error
openXLSObj.getWorkSheet(0).freezeCol(1) 'will freeze Row! but provide error message (in Excel)
закоментив заморозку - избавимся от ругани
видать в либе это криво реализовано (даже названия напутали)
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 933
609
BIT
177
обновил БД https://codeby.net/threads/41201.html?vi...st&p=205046
будут вопросы - спрашивайте, т.к. описание старое, а изменений много
видимые изменения коснулись формы импорта (выбор файлов)
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 933
609
BIT
177
некоторые "допиливания" в БД, версия 1.0.4b
на способность работать с "внешней" базой не проверял (хотя такое подразумевается)
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 933
609
BIT
177
готовлю фичи...
составной ключ - возможность отслеживания уникальности по нескольким колонкам хехеля (сейчас тока одна)
загрузка мёрженых строк (в колонках) - попадут в один док (сейчас - каждая строка - один док), если строки одной колонки смёржены - несмердженые будут как мультивэлью поле, в доке
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 933
609
BIT
177
обнаружил пару моментов при конвертации:
-float в ячейке дает short, через бридж - надо получать через getDoubleVal
-формулы вычислять надо в стринг а потом парсить в дабл (если надо число)
все эти моменты уже есть в коде
ключ для чисел "приводится" к целому (не вижу смысла бороться с округлениями)
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 933
609
BIT
177
выложил, с заявленными изменениями - 1.0.5b
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 933
609
BIT
177
изменения для работы с мультивэлью в полях - 1.0.6b
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 933
609
BIT
177
хочу пояснить, более явно :newconfus:, для чего можно использовать эту базу (в конечном счете - набор библиотек и логики)...

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

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 933
609
BIT
177
нахожусь в нек. задумчивости...
используемая либа OpenXLS 6.06 вполне работает на загрузку (чтение из файла)
но как "оказалось" делает что-то "не так" при выгрузке, созданные файлы открываются (хотя нужно шаманство с высотой строк) и в ОО и в ЛО и в МСО2003..., а вот МСО2007-2010 считают их "убитыми)
есть POI, кот. меня привлекает универсальностью (могет читать/писать всю МСхрень), но свежие либы только под 1.5+ жвм
удастся ли задействовать (не меняя интерфейса для обращения) ранние версии POI (3.2) , кот. допускают жвм 1.4 - не знаю
забить на 7-ку домины пока не могу
вощем - буду посмотреть
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 933
609
BIT
177
тест на выгрузку стрингов, в 7-ке, прошел номано (МСО 2003-2010 читают прально)
опирался на link removed
терь надо с др. версией POI проверить (в 8.5.х)
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 933
609
BIT
177
набросал новый интерфейс обсчения для импорта, через 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">
    Код:
    	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()
  • переход на , для обработки опций, для полей (в прежнем варианте - нахардкодено), полный шаблон не рализовывал ;) (за ненадобностью)
  • более четкое выделение обработки типов полей (прежний вариант был замуторный)
  • понабаянил всяких классов (уход от процедурного вида) и разделение по зонам ответственности, сделана некая композиция, где контроллером будет IOConfig
Ограничения LS2J, к кот. подошел - невозможность калбэков, кот. нужны для реализации , что необходимо для больших файлов (там SAX, но с обертками POI)
см. схемку ss_features_hssf_xssf_sxssf_.png
вариант - подавать ссылку на Variant , кот. заполняется из java (String[]), и с типизацией (итератор для получения соответ. значения по строке и колонке)
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 933
609
BIT
177
подумал и решил :)
схема действий будет такая (для больших файлов):
-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 памяти)
 
Последнее редактирование модератором:

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 933
609
BIT
177
новый код, по мотивам граблей "LS2J"
Код:
%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();
}
}
}
агент:
Код:
%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
 
Последнее редактирование модератором:

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 933
609
BIT
177
доработки по граблям, на этот раз поставлено ограничение в процессоре до 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]
 
Последнее редактирование модератором:

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 933
609
BIT
177
POC агент (измененный код)
Код:
	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)
 
Мы в соцсетях:

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