spring mvc 读取数据库的二进制流生成excel文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring mvc 读取数据库的二进制流生成excel文件相关的知识,希望对你有一定的参考价值。

参考技术A 用到的类 是 :
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

try
// List<String[]> 中的元素 行数组String[]为excel中的每一行
List<String[]> list = new ArrayList<String[]>();
InputStream is = new FileInputStream("test.xls");
HSSFWorkbook hwk = new HSSFWorkbook(is);// 将is流实例到 一个excel流里
HSSFSheet sh = hwk.getSheetAt(0);// 得到book第一个工作薄sheet
int rows = sh.getLastRowNum()+1 - sh.getFirstRowNum(); // 总行数
for(int i=0; i<rows; i++)
HSSFRow row = sh.getRow(i);
int cols = row.getLastCellNum()+1 - row.getFirstCellNum(); // 该行的总列数
String[] str = new String[cols]; // 用来存放该行每一列的值
for (int j = 0; j < cols; j++)
Object col = row.getCell((short)j);
str[j] = col.toString();


......
......
循环变量 i 和 j 可以自己设定从第几行开始读,第几列开始读,下标从0开始。
然后你想做什么判断想做什么数据匹配都可以自己加了。追问

你写的是怎么生成excel,没有这么复杂。我文件里面的东西是以二进制流保存在数据库的blob字段中的

无法从原始流生成正确的 wav 文件

【中文标题】无法从原始流生成正确的 wav 文件【英文标题】:Fail to generate correct wav file from raw stream 【发布时间】:2012-12-12 12:57:45 【问题描述】:

我捕获了原始音频数据流及其 WAVEFORMATEXTENSIBLE 结构。 WAVEFORMATEXTENSIBLE如下图所示:

按照 wav 文件的standard,我尝试将原始位写入 wav 文件。 我要做的是:

    写“RIFF”。

    写一个 DWORD。 (文件大小 - sizeof("RIFF") - sizeof(DWORD))。

=== WaveFormat 块 ===

    写“WAVEfmt”

    写一个 DWORD。 (WAVEFORMATEXTENSIBLE 结构的大小)

    编写 WAVEFORMATEXTENSIBLE 结构。

=== 事实块 ===

    写“事实”

    写一个 DWORD。 (四)

    写一个 DWORD。 (流中的样本数,应为 sizeof(rawdata)*8/wBitsPerSample )。

=== 数据块 ===

    写“数据”

    写一个 DWORD(原始数据的大小)

    写入原始数据。

通过上述步骤得到wav文件后,我用媒体播放器播放了wav文件,没有声音,用大胆播放会给我一个失真的声音,我可以听到这是我想要的正确音频,但是声音因噪音而失真。

原始数据可以在here找到

我生成的wav文件是here

这让我很困惑,因为当我使用相同的方法将 IEEE-float 数据转换为 wav 文件时,它工作得很好。

【问题讨论】:

您确定您的原始数据是 32 位的吗? 应该是,因为WAVEFORMATEX结构说是,而WAVEFORMATEX是从IAudioClient获取的。 但它是 32 位整数还是 32 位浮点数?这可能是问题的原因。您需要检查您的子类型 GUID 是否正确(PCM 或 FLOAT) 我不太明白,这些数据是通过hook到IAudioRenderClient中获取的,并拦截getBuffer和releaseBuffer方法。我从对应的 IAudioClient 获得了 WAVEFORMATEX 结构,我想我应该假设 WAVEFORMATEX 是正确的并按原样使用。 我不确定为什么 IAudioClient 上的 initialize 方法需要一个waveformatex 参数,GetMixFormat 方法不是很容易获得它吗?示例代码总是从IAudioClient的GetMixFormat中获取waveformatex,然后传回IAudioClient的initialize方法。 【参考方案1】:

我想通了,似乎 IAudioRenderClient 中的 getbuffer releasebuffer 循环将原始数据的格式与传递给 IAudioClient 的初始化方法的格式相同。

在我的例子中,IAudioClient 中的 GetMixFormat 与传递给 initialize 方法的格式不同。我认为 GetMixFormat 得到了设备支持的格式。

IAudioClient 应该已经完成​​了从初始化格式到混合格式的格式转换。我拦截了初始化方法,获取了格式,它就像一个魅力。

【讨论】:

【参考方案2】:

我正在拦截 WASAPI 以访问音频数据并面临完全相同的问题,即从数据生成的音频文件听起来像是正确的内容,但在某种程度上非常嘈杂,尽管帧速率、采样宽度、通道数等。设置正确。

WAVEFORMATEXTENSIBLE 的 SubFormat 字段显示数据实际上是 KSDATAFORMAT_SUBTYPE_IEEE_FLOAT,而我最初将其视为整数。根据this page,KSDATAFORMAT_SUBTYPE_IEEE_FLOAT 等价于 WAVEFORMATEX 中的 WAVE_FORMAT_IEEE_FLOAT。因此,将 wav 文件的 fmt 块(通常从第 20 位开始)中的“音频格式”设置为 WAVE_FORMAT_IEEE_FLOAT(即 3)解决了这个问题。记得把它放在小端。

音频格式的原始值 修改后

【讨论】:

以上是关于spring mvc 读取数据库的二进制流生成excel文件的主要内容,如果未能解决你的问题,请参考以下文章

spring mvc中如何读取数据库

使用流生成地图时忽略重复项

文件流生成文件

Jetty服务器关闭流生成500错误

如何用vs2008流生成excel文件

VLC播放器如何录制rtsp流生成视频文件?