csv出力Java_CSV 出力测试

这段代码展示了如何使用Java从Excel文件中提取数据并批量导出到CSV文件。通过遍历目录,寻找包含特定关键词的Excel文件,然后读取这些文件中的数据,依据特定key值写入CSV文件。同时,程序还包含了错误处理和日志记录功能。
摘要由CSDN通过智能技术生成

Public dic As Object '字典对象key:符合条件的excel的路径,value:对应的tag值

Private Declare Sub GetSystemTime Lib "kernel32" (lpSystemTime As SYSTEMTIME) '读取系统时间API'* 自定义系统时间类型

PrivateType SYSTEMTIME

wYearAs IntegerwMonthAs IntegerwDayOfWeekAs IntegerwDayAs IntegerwHourAs IntegerwMinuteAs IntegerwSecondAs IntegerwMillisecondsAs Integer

EndTypeSubtest()

tt=TimerDimcsvFile$

Application.ScreenUpdating= False

Set dic = CreateObject("scripting.dictionary")

setLog ("--------------开始出力----------------")Call FindFile("G:\CSV")

arr=dic.keysFor i = 0 To UBound(arr)

csvFile= "c:\" & dic(arr(i)) & ".csv"

Callgetdata(arr(i), dic(arr(i)), csvFile)NextiSet dic = NothingsetLog ("--------------结束出力----------------")MsgBox Timer -tt

Application.ScreenUpdating= True

End Sub

Function getit(ByVal filename As String) As String

Dim f, shell, s As String, i As Long

With CreateObject("scripting.filesystemobject")Set f =.GetFile(filename)Set shell = CreateObject("Shell.Application").Namespace(f.ParentFolder.Path)

s= shell.GetDetailsOf(shell.Items.Item(f.Name), 18)End Withgetit=sEnd Function

Function GetExcelTag(ByVal strPath As String) AsWorksheetSet xlapp = CreateObject("excel.application")

xlapp.Visible= Falsefile1= Dir(strPath & "")Do While file1 <> ""

Set xlbook = xlapp.Workbooks.Open(strPath &file1)

Debug.Print xlbook.BuiltinDocumentProperties("Keywords")

xlbook.Close (True)

file1= Dir

Loop

'Set xlbook = xlapp.Workbooks.Open(strPath)

'Set xlsheet = xlbook.Worksheets(1)

'xlbook.Close (True)

xlapp.Quit'Set xlsheet = Nothing

Set xlbook = Nothing

Set xlapp = Nothing

End Function

Public Sub FindFile(mPath As String, Optional sFile As String = "")Dim s As String, sDir() As String

Dim i As Long, d As Long, morder$, csvFile$Set xlapp = CreateObject("excel.application")

xlapp.Visible= False

If Right(mPath, 1) <> "\" ThenmPath= mPath & "\"

End If

'查找目录下的文件

s = Dir(mPath & sFile, vbArchive + vbDirectory + vbNormal +vbReadOnly)Do While s <> ""

If InStr(s, ".xlsx") > 0 Then

Set xlbook = xlapp.Workbooks.Open(mPath &s)

dic(mPath& s) = xlbook.BuiltinDocumentProperties("Keywords") 'getit(mPath & s)

xlbook.Close (True)End Ifs= Dir

Loop

'查找目录下的子目录

s = Dir(mPath, vbArchive + vbDirectory + vbNormal +vbReadOnly)Do While s <> ""

If s <> "." And s <> ".." Then

If (GetAttr(mPath & s) And vbDirectory) = vbDirectory Thend= d + 1

ReDim PreservesDir(d)

sDir(d)= mPath &sEnd If

End Ifs= Dir

Loopxlapp.QuitSet xlbook = Nothing

Set xlapp = Nothing

'开始递归

For i = 1 Tod

FindFile sDir(d)& "\"

Next

End Sub

Function getdata(sPath As Variant, model As String, csvFilePath AsVariant)Dim xlapp AsExcel.ApplicationDim xlbook AsExcel.WorkbookDim xlsheet AsExcel.WorksheetWithActiveWorkbook.Sheets(model)

filename= Mid(sPath, InStrRev(sPath, "\") + 1, Len(sPath) - InStrRev(sPath, "\") - 5) '把文件名提取出来'--------------------------------------------------------------------------------

If Dir(csvFilePath) = "" ThenOpen csvFilePathFor Output As #1

Print #1, "filename," & Join(Application.Transpose(.Range("a2:a" & .[A65536].End(xlUp).Row)), ",")

Close #1

End If

'--------------------------------------------------------------------------------'如果还未生产csv文件则生成

fieldNums=.[A65536].End(xlUp).Row'如果key存在1个以上的情况该怎么处理?

'zyx = i '记录key所在cell的行

For i = 2 To.[B65536].End(xlUp).RowIf .Cells(i, 2).Value = "key" Then KeyValue = .Cells(i, 1).ValueNexti'--------------------------------------------------------------------------------'找到key

Set xlapp = CreateObject("excel.application")

xlapp.Visible= False

Set xlbook =xlapp.Workbooks.Open(sPath)Set xlsheet = xlbook.Worksheets(1)Dim flag As Boolean, MoveFlag As Boolean, strRow$'--------------------------------------------------------------------------------' 打开excel表开始读数据,优先找key

MoveFlag= False

If KeyValue <> "" ThenxROW= xlsheet.Range(KeyValue).Row '记录key所在cell的行

yColumn = xlsheet.Range(KeyValue).Column '记录key所在cell的列

For xyz = xROW To xlsheet.Cells(65536, yColumn).End(xlUp).RowIf xlsheet.Cells(xyz, yColumn).Value <> "" Thenflag= TruestrRow= strRow & filename & ","

'检查

For i = 2 TofieldNumsIf .Cells(i, 3).Value = "○" Then '-----------------------------------------检查是必填项

'如果是和key所在的行是一样的情况:检查的就是偏移行

If xlsheet.Range(.Cells(i, 1).Value).Row <> xROW Then

If xlsheet.Range(.Cells(i, 1).Value) <> "" ThenstrRow= IIf(i = fieldNums, strRow & xlsheet.Range(.Cells(i, 1).Value), strRow & xlsheet.Range(.Cells(i, 1).Value) & ",")ElsesetLog ("【文件:" + filename + "| key值:" + xlsheet.Cells(xyz, yColumn).Value + "cell名称:" + .Cells(i, 1).Value + "(行:" + Str(xlsheet.Range(.Cells(i, 1).Value).Row) + "列:" + Str(xlsheet.Range(.Cells(i, 1).Value).Column) + ")的值不能为空!】")'log出力

flag = FalseMoveFlag= True

End If

Else

If xlsheet.Range(.Cells(i, 1).Value).Offset(xyz - xROW, 0) <> "" ThenstrRow= IIf(i = fieldNums, strRow & xlsheet.Range(.Cells(i, 1).Value).Offset(xyz - xROW, 0), strRow & xlsheet.Range(.Cells(i, 1).Value).Offset(xyz - xROW, 0) & ",")ElsesetLog ("【文件:" + filename + "| key值:" + xlsheet.Cells(xyz, yColumn).Value + "cell名称:" + .Cells(i, 1).Value + "(行:" + Str(xyz) + "列:" + Str(xlsheet.Range(.Cells(i, 1).Value).Column) + ")的值不能为空!】")'log出力

flag = FalseMoveFlag= True

End If

End If

Else '不检查

strRow = IIf(i = fieldNums, strRow & xlsheet.Range(.Cells(i, 1).Value), strRow & xlsheet.Range(.Cells(i, 1).Value) & ",")End If

Nexti'------------------------------------------------------------------------------------------'出力到csv

If flag ThenOpen csvFilePathFor Append As #2

Print #2, strRow

Close #2setLog ("【文件:" + filename + "| Key值:" + xlsheet.Cells(xyz, yColumn).Value + "(行:" + Str(xyz) + "列:" + Str(yColumn) + ")正常出力!】")End If

Else '-----------------------------------------------------------------------'出力log 表示为key的值不能为空’该条数据不出力

setLog ("【文件:" + filename + "| (行:" + Str(xyz) + "列:" + Str(yColumn) + ")Key值不能为空!】")End IfstrRow= "" '--------------------------------------------------------情况临时存放数据开始进行下一次的循环

NextxyzElse '---------------------------------------------------------------------------没有key的场合只跑一遍

flag = True

'----------------------------------------------------------------------------各项目检查

For i = 2 TofieldNumsIf .Cells(i, 3).Value = "○" Then '检查是必填项

If xlsheet.Range(.Cells(i, 1).Value) <> "" ThenstrRow= strRow & xlsheet.Range(.Cells(i, 1).Value) & ","

ElsesetLog ("【文件:" + filename + "| key值:" + xlsheet.Cells(xyz, yColumn).Value + "cell名称:" + .Cells(i, 1).Value + "(行:" + Str(xlsheet.Range(.Cells(i, 1).Value).Row) + "列:" + Str(xlsheet.Range(.Cells(i, 1).Value).Column) + ")的值不能为空!】")'log出力

flag = FalseMoveFlag= True

End If

Else '不检查

strRow = strRow & xlsheet.Range(.Cells(i, 1).Value) & ","

End If

NextiIf flag Then

'出力到csv

Open csvFilePath For Append As #2

Print #2, strRow

Close #2setLog ("【文件:" + filename + "| Key值:" + xlsheet.Cells(xyz, yColumn).Value + "(行:" + Str(xyz) + "列:" + Str(yColumn) + ")正常出力!】")End If

End If

'------------------------------------------------------------------------------------------关闭打开的execl对象

xlbook.Close (True)

xlapp.QuitSet xlsheet = Nothing

Set xlbook = Nothing

Set xlapp = Nothing

End With

If MoveFlag Then

'只要过程中友出现异常了,移动excel到指定文件夹

End If

End Function

Private Sub setLog(strInput AsVariant)Dim SysTime AsSYSTEMTIME, logPath$, strReturn$

GetSystemTime SysTime

logPath= "c:\" + CStr(Year(Now)) + Format(Month(Now), "00") + Format(Day(Now), "00") + ".log"strReturn= CStr(Date) & "_" & CStr(Time) + " " + Format(CStr(SysTime.wMilliseconds), "000") + " " & strInput '添加系统时间后的录入字符

If Dir(logPath) = "" ThenOpen logPathFor Output As #3

Print #3, strReturn

Close #3

ElseOpen logPathFor Append As #4

Print #4, strReturn

Close #4

End If

End Sub

Sub gettest(wSheet AsWorksheet)

Debug.Print wSheet.[a1]End Sub

Subaatest()

GetExcelTag ("G:\CSV\")End Sub

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值