Да, вот он use pyo3::{wrap_pyfunction, prelude::*}; use calamine::{open_workbook_auto, DataType, Range, Reader}; use

std::fs::File;
use std::io::{BufWriter, Write};
use std::path::PathBuf;
/// Formats the sum of two numbers as string.
/// A Python module implemented in Rust.
#[pymodule]
fn xlsx2csv(_py: Python, m: &PyModule) -> PyResult<()> {
m.add_function(wrap_pyfunction!(make_csv, m)?)?;
Ok(())
}
#[pyfunction]
fn make_csv(py: Python, file: String, separator: Option<String>)-> PyResult<&PyAny> {
println!("Создаём файлы");
//Первый файл
let sce = PathBuf::from(&file);
match sce.extension().and_then(|s: &std::ffi::OsStr| s.to_str()) {
Some("xlsx") | Some("xlsm") | Some("xlsb") | Some("xls") => (),
_ => panic!("Expecting an excel file"),
}

let dest: PathBuf = sce.with_extension("csv");
let mut dest = BufWriter::new(File::create(dest).unwrap());
let mut xl = open_workbook_auto(&file).unwrap();
let range = xl.worksheet_range_at(0).unwrap().unwrap();
let sep = separator.unwrap_or(','.to_string());
let locals = pyo3_asyncio::TaskLocals::with_running_loop(py)?.copy_context(py)?;
return pyo3_asyncio::tokio::future_into_py_with_locals(py, locals.clone(), write_range(&mut dest, range.clone(), sep));
}

async fn write_range<W: Write>(dest: &mut W, range: Range<DataType>, separator: String) -> Result<(), PyErr> {
let n = range.get_size().1 - 1;
for r in range.rows() {
for (i, c) in r.iter().enumerate() {
match *c {
DataType::Empty => Ok(()),
DataType::String(ref s) | DataType::DateTimeIso(ref s) | DataType::DurationIso(ref s) => {
write!(dest, "{}", s)
}
DataType::DateTime(ref s) | DataType::Duration(ref s) => {write!(dest, "{}", s.to_string())}
DataType::Float(ref f) => {
write!(dest, "{}", f)
}

DataType::Int(ref i) => write!(dest, "{}", i),
DataType::Error(ref e) => write!(dest, "{:?}", e),
DataType::Bool(ref b) => write!(dest, "{}", b),
}?;
if i != n {
write!(dest, "{}", separator)?;
}
}
write!(dest, "\r\n")?;
}
Ok(())
}

5 ответов

71 просмотр
krakotay- Автор вопроса

Так что, как решить?

Это не об этом ли недавно статья на хабре была?.. 🤔

krakotay- Автор вопроса
Крывашек
Это не об этом ли недавно статья на хабре была?.. ...

Да. Говном вышла статья, признаюсь. Полезный опыт зато)

krakotay
Да. Говном вышла статья, признаюсь. Полезный опыт ...

Ну, там была пара комментариев без лишних эмоций, с достаточно конструктивной критикой (редкость для хабра) - не буду их повторять.

Похожие вопросы

Обсуждают сегодня

Всем привет. Ребята, подскажите, пожалуйста. у ботов есть ограничение на отправку сообщений - 30 сообщений в секунду, эти ограничения накладываются на все сообщения? или на со...
Artem Stormageddon
4
Блин, ребята, сори за тупые вопросы. А можно ли как-то открыть вебапку по нажатию на кнопку в меню(которое появляется слева, команды)?
Artem Stormageddon
3
Ребята, всем привет. Подскажите, пожалуйста, можно ли как-то через бота понять, что этого бота добавили в группу\канал и выдали ему права администратора?
Artem Stormageddon
9
Привет всем! Почему этот код не срабатывает при добавлении или удалении пользователя из чата? bot.on('chat_member', async (ctx) => { console.log(ctx); }) bot.launch({allo...
Alexander
7
Всем привет. Не понимаю, в чём тут шутка юмора. Убирается только разрешение на send_messages. А send_media_messages остаётся. Как сделать, чтобы оба убирались? await b...
Alexander
2
Есть тут кто занимается разработкой серваков майна? Или знакомые
meow *
3
'frakturBold' => ['𝖆', '𝖇', '𝖈', '𝖉', '𝖊', '𝖋', '𝖌', '𝖍', '𝖎', '𝖏', '𝖐', '𝖑', '𝖒', '𝖓', '𝖔', '𝖕', '𝖖', '𝖗', '𝖘', '𝖙', '𝖚', '𝖛', '𝖜', '𝖝', '𝖞', '𝖟', '𝕬', '𝕭', '𝕮', '𝕯'...
Roma
4
Есть ли лимиты на кол-во вебхук по домену? Стоит в данный момент 900+ ботов и бывает бот перестает отвечать (не приходят вебхуки) 🐒 Помогает только перезапуск
ᅠ [ Кому не ответил, дублируйте ]
11
а что делать если тебя убивают на картах?
Yarik yarik kyda ti lezesh
43
Товарищи, здравствуйте Подскажите, пожалуйста, может кто-нибудь сталкивался с такой задачей Через вебапку можно сканировать qr-код, а есть ли возможность считывать nfc?
Artem Stormageddon
8
Карта сайта