每次调用“workbook.createFont()”都会向工作簿添加新字体。有没有方便的方法来重用这些字体?
显然,我可以在程序中重用字体对象。但是当我重新打开Java程序时,我需要一种方法来取回Font对象。
虽然可以使用“workbook.getNumberOfFonts()”和“workbook.getFontAt(i)”,但使用这些方法并不是很方便。
我的解决方法:
我在创建字体时添加一个 CustomProperty,其中保存了字体对应的编号。
Map<String, Font> fonts = new HashMap<>();
CustomProperties customProps = workbook.getProperties().getCustomProperties();
if(customProps.contains("arial_12_b")) {
short index = customProps.getProperty("arial_12_b").getI2();
fonts.put("arial_12_b", workbook.getFontAt(index));
} else {
Font font = workbook.createFont();
font.setFontName("Arial");
font.setFontHeightInPoints((short)12);
font.setBold(true);
customProps.addProperty("arial_12_b", font.getIndex());
fonts.put("arial_12_b", font);
}
Run Code Online (Sandbox Code Playgroud)
CellStyle 通过 CellUtil 类解决了同样的问题,该类检查 CellStyle 是否已存在,如果不存在则创建它。有类似 Font 的东西吗?
最好的问候
Afoee
我想编写一个带有基于T ext的U ser I接口(TUI)的程序,它由几种形式组成.
这是我的尝试,它使用库npyscreen但不返回第一个表单.代码也不包含更改列表项的逻辑.
#! /usr/bin/env python3
# coding:utf8
import npyscreen
# content
headers = ["column 1", "column 2", "column 3", "column 4"]
entries = [["a1", "a2", "a3", "a4"],
["b1", "b2", "b3", "b4"],
["c1", "c2", "c3", "c4"],
["d1", "d2", "d3", "d4"],
["e1", "e2", "e3", "e4"]]
# returns a string in which the segments are padded with spaces.
def format_entry(entry):
return "{:10} | {:10} | {:10} | {:10}".format(entry[0], entry[1] , …Run Code Online (Sandbox Code Playgroud) 我有两台具有固定 IP 地址的 linux 计算机:
不幸的是,通过 CUPS 的打印机传播似乎不能可靠地工作(可能是由于网络结构)。
我可以将打印作业直接从 python 程序发送到 CUPS 打印服务器吗?
如果是这样,你能提供一个小例子吗?
理论上,我只会将格式正确的数据发送到 IP 地址 + 端口,但我没有让它工作......
以下是我迄今为止发现的方法以及我遇到的问题:
命令'lpr'
import subprocess
lpr = subprocess.Popen("usr/bin/lpr", stdin=subprocess.PIPE) # on some distros the command is 'lp'
lpr.stdin.write("hello world\n")
lpr.stdin.close()
Run Code Online (Sandbox Code Playgroud)
依赖于通过 CUPS 的打印机传播。
python 模块pycups
import cups
with open("/home/user/Documents/some.txt", "w") as f:
f.write("hello world\n")
conn = cups.Connection()
conn.printFile("test_printer", "/home/user/Documents/some.txt", "some_title", {})
Run Code Online (Sandbox Code Playgroud)
在我可以使用打印机之前,我必须先添加它,这又依赖于通过 CUPS 的传播。
我也没有conn.addPrinter()去上班。
python 模块python-escpos / python-printer-escpos …
math.isclose()存在以确定两个值之间的差异是否在容差范围内.
据我了解,此容差的默认值为:
rel_tol = 1e-09abs_tol = 0.0
如果我将两个值都设置为0.0,那么它应该测试两个值是否相同.
这似乎适用于较小的值:
import math
math.isclose(1000, 1000, rel_tol=0.0, abs_tol=0.0) # True
math.isclose(1000, 1001, rel_tol=0.0, abs_tol=0.0) # False
Run Code Online (Sandbox Code Playgroud)
但它失败了很大的值:
import math
import sys
math.isclose(sys.maxsize, sys.maxsize, rel_tol=0.0, abs_tol=0.0) # True
math.isclose(sys.maxsize, sys.maxsize-1, rel_tol=0.0, abs_tol=0.0) # True
math.isclose(sys.maxsize, sys.maxsize-100, rel_tol=0.0, abs_tol=0.0) # True
math.isclose(sys.maxsize, sys.maxsize-1000, rel_tol=0.0, abs_tol=0.0) # False
Run Code Online (Sandbox Code Playgroud)
似乎还有相对的宽容?
为什么会出现这种情况?
上面的代码是用Python 3.5.2运行的.
更新1:
当使用非常大的浮点值时,似乎会发生类似的行为:
import math
import sys
m = sys.float_info.max # type 'float'
math.isclose(m, m) # True
math.isclose(m, m-1.0) # True …Run Code Online (Sandbox Code Playgroud) 在重新抛出被拒绝的 Promise 的错误时,我注意到堆栈跟踪似乎不完整。
例如:
// returns a Promise that is later on rejected.
function a() {
return new Promise((resolve, reject)=>{
setTimeout(()=>reject(new Error("a")), 2000);
});
}
async function b() {
await a();
}
async function c() {
await b();
}
// testing
async function test() {
let printError = (error)=>console.log(error.stack);
await a().catch(printError);
await b().catch(printError);
await c().catch(printError);
}
test();
Run Code Online (Sandbox Code Playgroud)
所有三个函数调用都会test()打印以下内容:
Error: a
at <anonymous>:4:31
Run Code Online (Sandbox Code Playgroud)
我本来期望的是这样的:
Error: a
at <anonymous>:4:31
at new Promise (<anonymous>)
at a (<anonymous>:3:12)
at b2 (<anonymous>:13:15)
at …Run Code Online (Sandbox Code Playgroud) python ×4
python-3.x ×2
tui ×2
urwid ×2
apache-poi ×1
button ×1
compare ×1
cups ×1
equality ×1
excel ×1
fonts ×1
helper ×1
java ×1
javascript ×1
npyscreen ×1
precision ×1
printing ×1
promise ×1
stack-trace ×1