从excel读取图像并将其存储在sql server中
Posted
技术标签:
【中文标题】从excel读取图像并将其存储在sql server中【英文标题】:Reading image from excel and storing it in sqlserver 【发布时间】:2015-12-29 02:42:42 【问题描述】:我有一个名为“tab1”的表
cl_id int //auto imcrement
cl_image image
我想用图片从excel中读取一张图片并将其存储在上表中
FileInputStream fileInputStream = new FileInputStream(
"Delux.xls");
System.out.println(fileInputStream);
HSSFWorkbook workbook = new HSSFWorkbook(fileInputStream);
HSSFSheet worksheet = workbook.getSheet("Delux");
Iterator rows = worksheet.rowIterator();
HSSFRow row = (HSSFRow) rows.next();
List lst = workbook.getAllPictures();
Iterator it = lst.iterator();
while (rows.hasNext())
row = (HSSFRow) rows.next();
//reading the image from excel
HSSFCell cellP1 = row.getCell((short) 1);
PictureData pict = (PictureData)it.next();
String ext = pict.suggestFileExtension();
byte[] data = pict.getData();
InputStream is = new ByteArrayInputStream(data);
try
PreparedStatement stmt = getdbconn()
.prepareStatement(
"insert into tab1 (cl_image) values(?)");
stmt.setBinaryStream(1, is);
stmt.executeUpdate();
is.close();
catch (ClassNotFoundException e)
e.printStackTrace();
catch (SQLException e)
e.printStackTrace();
但是当我动态存储图像时,我得到了类似的错误
“字符串或二进制数据将被截断”。
谁能给我建议一个方法来实现这一点???
【问题讨论】:
您是否尝试过使用给出长度的PreparedStatement.setBinaryStream
方法? stmt.setBinaryStream(1, is, data.length);
是的,我试过了,但它不起作用
data.length
有多大?
它因不同的图像而异,例如 140,200 等
当然会有所不同。如果发生错误,它有多大?如果它真的没有那么大,请确保您的字段数据类型cl_image
真的是image
。或者试试varbinary(max)
。
【参考方案1】:
IMAGE 和 TEXT 等数据类型将不受支持且已弃用。 所以将其更改为 VARBINARY(max)。最重要的导入内容是 IMAGE 数据类型需要以特殊方式存储大小,而不是扩展 VARBINARY 以适应任何一直到 2GB 的需求。您得到的错误是由于图像不适合 cl_image 字段而引发的。
【讨论】:
以上是关于从excel读取图像并将其存储在sql server中的主要内容,如果未能解决你的问题,请参考以下文章
从 excel 文件列中读取列表列表并将其存储在 python 列表中