Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе
есть куча кода и 100500 вариантоввсем привет. может у кого-то есть готовый код по импорту из эксел в лотус. просто в поиске никак не находится нормальная информация. но точно где-то попадался готовый код и может даже здесь
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();
}
}
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;
}
}
}
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 +";");
}
}
List<String>lst=((List<String>) value.get(k));
arr.removeAll(lst);
arr.addAll(lst);
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();
}
}
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 +";");
}
}
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
с правами все норм. Ни в одну папку не сохраняет, при этом в ту же директорию я могу сформировать текстовый файл с помощью Print@Eugen доступа не хватает. Прав нет?
Ты можешь, а он нет. У него нет прав. Под каким пользователем запущен Domino на сервере Windows, какие у этого пользователя права? И ещё права на COM объект могут быть какие-нибудь.с правами все норм. Ни в одну папку не сохраняет, при этом в ту же директорию я могу сформировать текстовый файл с помощью Print
Через Print сервер может, я это имел в виду. Решил проблему весьма странным образом, вычитанным в сети: создал папки "C:\windows\system32\config\systemprofile\Desktop" и "C:\windows\sysWOW64\config\systemprofile\Desktop" и ребутнул тачку.Ты можешь, а он нет
вот разные извращения видал, но такое...Есть агент, который формирует xls файл через COM. Вызывается через веб - из xPage через runWithDocumentContext.
Плагин этот тоже пользуем, но не всегда он удобен для Excel. Что по поводу агента с COM - он с каких-то древних времен, поэтому и остался в таком виде.вот разные извращения видал, но такое...
xPages кот. с jvm и стало быть с POI и всякие ништяки взять и использовать для вызова КОМы...
как пример готового плагинаСсылка скрыта от гостей
с COM оно всегда так.Решил проблему весьма странным образом...
как-то по контракту писал рапер для эхелевской КОМы, для ЛС, все один в один получилось (тогда использовал не POI, но тоже java либу)Что по поводу агента с COM - он с каких-то древних времен
ну не обязательно именно плагин, можно и "голый" POI, можно и jxls (там шаблоны)Плагин этот тоже пользуем, но не всегда он удобен для Excel
Обучение наступательной кибербезопасности в игровой форме. Начать игру!