Недавно у меня была подобная ситуация, однако, я не нашел хорошее решение в в Интернете, но я написал базовый код, который делал то, что мне было нужно.
В вашем случае вам необходимо скопировать файл excel из источника (Remote Directory) с помощью SmbFile с аутентификацией в пункт назначения (Local Directory) и только после этого, преобразовать путь к файлу excel адресата (getCanonicalPath() функция) и преобразовать его из формата SmbFile в формат файла с помощью кода ниже. После этого создайте объект File с помощью пути назначения файла и сделайте то, что хотите.
Я использую JCIFS для работы с удаленными общими каталогами, используя класс SMBFILE.
Во-первых, вам необходимо импортировать основные библиотеки:
import java.io.File;
import java.io.IOException;
import jcifs.smb.SmbFile;
Во-вторых, вам нужно создать статический метод для преобразования из SmbFile формат Формат файла:
/**
* This method convert a directory path from SmbFile format to File format.<br />
* <p><strong>Sintax:</strong> <br /> convertSmbFileToFile("Canonical Path")</p>
* <p><strong>Example:</strong> <br /> convertSmbFileToFile("smb://localhost/D$/DOCUMENTOS/workspace/tests2/access")</p>
* @param smbFileCanonicalPath String
* @see String
*/
public static String convertSmbFileToFile(String smbFileCanonicalPath) {
String[] tempVar = smbFileCanonicalPath.substring(6).replace("$", ":").split("/");
String bar = "\\";
String finalDirectory = "";
for (int i = 1; i < tempVar.length; i++) {
finalDirectory += tempVar[i] + bar;
if (i == tempVar.length - 1) {
finalDirectory = finalDirectory.substring(0,finalDirectory.length()-1);
}
}
return finalDirectory;
}
Opcional, вы также можете создать статический метод для преобразования из Файл формат в SmbFile Формат:
/**
* This method convert a directory path from File format to SmbFile format.<br />
* <p><strong>Sintax:</strong> <br /> convertFileToSmbFile("Canonical Path")</p>
* <p><strong>Example:</strong> <br /> convertFileToSmbFile("D:\DOCUMENTOS\workspace\tests2\access")</p>
* @param fileCanonicalPath String
* @see String
*/
public static String convertFileToSmbFile(String fileCanonicalPath) {
return "smb://localhost/" + fileCanonicalPath.toString().replace(":", "$").replace("\\", "/");
}
Наконец, вы можете назвать такие методы, как на примере ниже:
String dirDest = "access/";
try {
File localDirFile = new File(dirDest);
SmbFile localSmbDirFile = new SmbFile(convertFileToSmbFile(localDirFile.getCanonicalPath()));
File localDirFile2 = new File(convertSmbFileToFile(localSmbDirFile.getCanonicalPath()));
System.out.println("Original File Format: " + localDirFile.getCanonicalPath());
System.out.println("Original File Format to SmbFile Format: " + localSmbDirFile.getCanonicalPath());
System.out.println("Converted SmbFile Format to File Format: " + localDirFile2.getCanonicalPath());
} catch (IOException e) {
System.err.println("[ERR] IO Exception - " + e);
}
Результат предыдущего кода запуска:
Original File Format: D:\DOCUMENTOS\workspace\tests2\access
Original File Format to SmbFile Format: smb://localhost/D$/DOCUMENTOS/workspace/tests2/access
Converted SmbFile Format to File Format: D:\DOCUMENTOS\workspace\tests2\access
Дополнительная информация: getCanonicalPath()
Возможно, этот код поможет вам, и я могу поговорить, если вы хотите.
Удачи!
Включает ли другая библиотека что-либо еще, кроме файла? Например. 'InputStream'? Если да, вы можете использовать 'SmbFile.getInputStream()'. Если нет, вы можете загрузить файл локально (например, во временный файл) и использовать его для другой библиотеки. Будет ли это работать на вас? –
Библиотека работает с InputStream, но проблема в том, что она также закрывает поток после обработки каждого листа excel, а затем я должен открыть его снова для следующего листа, который, я думаю, должен быть в порядке. Загрузка файла не является вариантом из-за размера excel (1GB +). Я попробую InputStream и дам вам знать. –
Можете ли вы включить библиотеку, которую вы используете для синтаксического анализа excel? Возможно, это вызывает больше людей, чтобы помочь. –