EPPLUS图片位置能定位到单元格,图片的大小与单元格列宽行高的0.5倍,图片在单元格内居中。

要用EPPLUS输出一个Excel文档,图片要求居中单元格内,大小是单元格
列宽行高的0.5倍。图片是浮动的,不能固定到某个单元格,但是代码能控制图片的位置,Excel列宽和行高单位是不一致的,思考过转换成像素,
代码水平不够弄不出来,有没有大佬能给点代码。。。居中思考的是
(单元格列宽-图片宽)/2
(单元格行高-图片高)/2

主要是转换像素和转换完之后的问题,代码这块水平比较缺,大佬们方便的话
能贴上代码最好了。

pic1.SetSize((int)imageWidth, (int)imageHeight);
pic1.SetPosition( 0,x,1,y);

大小和定位这里搞不来。。

图片效果

2个回答

搞定了!!!我们自己封装了一个方法

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using OfficeOpenXml;
using OfficeOpenXml.Drawing;

namespace Egem.Report
{
public class EPPlusPicture
{
public static void CreatePicture(ExcelWorksheet worksheet, string name, Image image, int firstColumn, int lastColumn, int firstRow, int lastRow, int defaultOffsetPixels)
{
int columnWidth = GetWidthInPixels(worksheet.Cells[firstRow, firstColumn]);
int rowHeight = GetHeightInPixels(worksheet.Cells[firstRow, firstColumn]);

        int totalColumnWidth = columnWidth * (lastColumn - firstColumn + 1);
        int totalRowHeight = rowHeight * (lastRow - firstRow + 1);
        double cellAspectRatio = Convert.ToDouble(totalColumnWidth) / Convert.ToDouble(totalRowHeight);

        int imageWidth = image.Width;
        int imageHeight = image.Height;
        double imageAspectRatio = Convert.ToDouble(imageWidth) / Convert.ToDouble(imageHeight);

        int pixelWidth;
        int pixelHeight;
        if (imageAspectRatio > cellAspectRatio)
        {
            pixelWidth = totalColumnWidth - defaultOffsetPixels * 2;
            pixelHeight = pixelWidth * imageHeight / imageWidth;
        }
        else
        {
            pixelHeight = totalRowHeight - defaultOffsetPixels * 2;
            pixelWidth = pixelHeight * imageWidth / imageHeight;
        }

        int rowOffsetPixels = (totalRowHeight - pixelHeight) / 2;
        int columnOffsetPixels = (totalColumnWidth - pixelWidth) / 2;

        int rowOffsetCount = 0;
        int columnOffsetCount = 0;

        if (rowOffsetPixels > rowHeight)
        {
            rowOffsetCount = (int)Math.Floor(Convert.ToDouble(rowOffsetPixels) / Convert.ToDouble(rowHeight));
            rowOffsetPixels -= rowHeight * rowOffsetCount;
        }

        if (columnOffsetPixels > columnWidth)
        {
            columnOffsetCount = (int)Math.Floor(Convert.ToDouble(columnOffsetPixels) / Convert.ToDouble(columnWidth));
            columnOffsetPixels -= columnWidth * columnOffsetCount;
        }

        int row = firstRow + rowOffsetCount - 1;
        int column = firstColumn + columnOffsetCount - 1;

        ExcelPicture pic = worksheet.Drawings.AddPicture(name, image);
        pic.SetPosition(row, rowOffsetPixels, column, columnOffsetPixels);
        pic.SetSize(pixelWidth, pixelHeight);
    }

    public static int GetHeightInPixels(ExcelRange cell)
    {
        using (Graphics graphics = Graphics.FromHwnd(IntPtr.Zero))
        {
            float dpiY = graphics.DpiY;
            return (int)(cell.Worksheet.Row(cell.Start.Row).Height * (1 / 72.0) * dpiY);
        }
    }

    public static float MeasureString(string s, Font font)
    {
        using (var g = Graphics.FromHwnd(IntPtr.Zero))
        {
            g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
            return g.MeasureString(s, font, int.MaxValue, StringFormat.GenericTypographic).Width;
        }
    }

    public static int GetWidthInPixels(ExcelRange cell)
    {
        double columnWidth = cell.Worksheet.Column(cell.Start.Column).Width;
        Font font = new Font(cell.Style.Font.Name, cell.Style.Font.Size, FontStyle.Regular);
        double pxBaseline = Math.Round(MeasureString("1234567890", font) / 10);
        return (int)(columnWidth * pxBaseline);
    }
}

}

参考:

using Spire.Xls;
using System.Drawing;

namespace InsertImage_XLS
{
    class Program
    {
        static void Main(string[] args)
        {
            //创建Workbook对象
            Workbook workbook = new Workbook();  
            //获取第一张工作表
            Worksheet sheet = workbook.Worksheets[0];
            //指定列宽、行高
            sheet.Columns[0].ColumnWidth = 50;
            sheet.Rows[0].RowHeight = 160;

            //加载图片,添加到指定单元格
            ExcelPicture picture = sheet.Pictures.Add(1,1, "tp.png");
            //指定图片宽度和高度
            picture.Width = 300;
            picture.Height = 180;

            //通过LeftColumnOffset和TopRowOffset属性值设置图片在单元格中的横向、纵向对齐(位置)
            picture.LeftColumnOffset = 75;
            picture.TopRowOffset = 20;

            //保存文档
            workbook.SaveToFile("result.xlsx", FileFormat.Version2013);
            System.Diagnostics.Process.Start("result.xlsx");
        }
    }
}

效果图:
图片说明

(注:这里是用的Excel控件
Spire.XLS)

weixin_44202887
weixin_44202887 非常感谢您的回答!是这样的,我们是想不定义图片的宽度和高度的,而是根据单元格的长度宽度乘以一个比例,得出照片的大小。我是卡在,图片的宽高单位和Excel列宽行高单位不一样。之前用NPOI做是转换成像素,代码我稍后贴上。非常感谢您的回复
11 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
急 在线等 谢谢!java想要读取excel中某以特定单元格的值,现在是循环读出所有的值,请帮忙修改一下
package com.excel.action; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.List; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFDateUtil; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.poifs.filesystem.POIFSFileSystem; import jxl.Workbook; import jxl.format.Alignment; import jxl.format.Border; import jxl.format.BorderLineStyle; import jxl.format.Colour; import jxl.format.UnderlineStyle; import jxl.write.Label; import jxl.write.NumberFormats; import jxl.write.WritableCellFormat; import jxl.write.WritableFont; import jxl.write.WritableSheet; import jxl.write.WritableWorkbook; import jxl.write.WriteException; import jxl.write.biff.RowsExceededException; public class JxlTable { private final static JxlTable jxlTable = new JxlTable(); public static JxlTable getInstance() { return jxlTable; } public JxlTable() { } public boolean createTable(String[][] body, String filePath,int rowLength) { boolean createFlag = true; WritableWorkbook book; try { // 根据路径生成excel文件 book = Workbook.createWorkbook(new File(filePath)); // 创建一个sheet名为"表格" WritableSheet sheet = book.createSheet("表格", 0); // 设置NO列宽度 sheet.setColumnView(1, 5); // 去掉整个sheet中的网格线 sheet.getSettings().setShowGridLines(false); Label tempLabel = null; // 表体输出 int bodyLen = body.length; String[][] bodyTempArr = body ; // 循环写入表体内容 for(int i=0;i<rowLength;i++) { for(int j=0;j<body[i].length;j++) { WritableCellFormat tempCellFormat = null; tempCellFormat = getBodyCellStyle(); if (tempCellFormat != null) { if (j == 0 || j == (bodyTempArr.length - 1)) { tempCellFormat.setAlignment(Alignment.CENTRE); } } tempLabel = new Label(1 + j, 2 + i, bodyTempArr[i][j], tempCellFormat); sheet.addCell(tempLabel); } } book.write(); book.close(); } catch (IOException e) { createFlag = false; System.out.println("EXCEL创建失败!"); e.printStackTrace(); } catch (RowsExceededException e) { createFlag = false; System.out.println("EXCEL单元设置创建失败!"); e.printStackTrace(); } catch (WriteException e) { createFlag = false; System.out.println("EXCEL写入失败!"); e.printStackTrace(); } return createFlag; } public WritableCellFormat getHeaderCellStyle() { WritableFont font = new WritableFont(WritableFont.createFont("宋体"), 10, WritableFont.BOLD, false, UnderlineStyle.NO_UNDERLINE); WritableCellFormat headerFormat = new WritableCellFormat( NumberFormats.TEXT); try { // 添加字体设置 headerFormat.setFont(font); // 设置单元格背景色:表头为黄色 headerFormat.setBackground(Colour.YELLOW); // 设置表头表格边框样式 // 整个表格线为粗线、黑色 headerFormat.setBorder(Border.ALL, BorderLineStyle.THICK, Colour.BLACK); // 表头内容水平居中显示 headerFormat.setAlignment(Alignment.CENTRE); } catch (WriteException e) { System.out.println("表头单元格样式设置失败!"); } return headerFormat; } public WritableCellFormat getBodyCellStyle() { WritableFont font = new WritableFont(WritableFont.createFont("宋体"), 10, WritableFont.NO_BOLD, false, UnderlineStyle.NO_UNDERLINE); WritableCellFormat bodyFormat = new WritableCellFormat(font); try { // 设置单元格背景色:表体为白色 bodyFormat.setBackground(Colour.WHITE); // 设置表头表格边框样式 // 整个表格线为细线、黑色 bodyFormat .setBorder(Border.ALL, BorderLineStyle.THIN, Colour.BLACK); } catch (WriteException e) { System.out.println("表体单元格样式设置失败!"); } return bodyFormat; } /** * 读取Excel的内容,第一维数组存储的是一行中格列的值,二维数组存储的是多少个行 * @param file 读取数据的源Excel * @param ignoreRows 读取数据忽略的行数,比喻行头不需要读入 忽略的行数为1 * @return 读出的Excel中数据的内容 * @throws FileNotFoundException * @throws IOException */ public static String[][] getData(File file, int ignoreRows) throws FileNotFoundException, IOException { List<String[]> result = new ArrayList<String[]>(); int rowSize = 0; BufferedInputStream in = new BufferedInputStream(new FileInputStream( file)); // 打开HSSFWorkbook POIFSFileSystem fs = new POIFSFileSystem(in); HSSFWorkbook wb = new HSSFWorkbook(fs); HSSFCell cell = null; for (int sheetIndex = 0; sheetIndex < wb.getNumberOfSheets(); sheetIndex++) { HSSFSheet st = wb.getSheetAt(sheetIndex); // 第一行为标题,不取 for (int rowIndex = ignoreRows; rowIndex <= st.getLastRowNum(); rowIndex++) { HSSFRow row = st.getRow(rowIndex); if (row == null) { continue; } int tempRowSize = row.getLastCellNum() + 1; if (tempRowSize > rowSize) { rowSize = tempRowSize; } String[] values = new String[rowSize]; Arrays.fill(values, ""); boolean hasValue = false; for (short columnIndex = 0; columnIndex <= row.getLastCellNum(); columnIndex++) { String value = ""; cell = row.getCell(columnIndex); if (cell != null) { // 注意:一定要设成这个,否则可能会出现乱码 cell.setEncoding(HSSFCell.ENCODING_UTF_16); switch (cell.getCellType()) { case HSSFCell.CELL_TYPE_STRING: value = cell.getStringCellValue(); break; case HSSFCell.CELL_TYPE_NUMERIC: if (HSSFDateUtil.isCellDateFormatted(cell)) { Date date = cell.getDateCellValue(); if (date != null) { value = new SimpleDateFormat("yyyy-MM-dd") .format(date); } else { value = ""; } } else { value = new DecimalFormat("0").format(cell .getNumericCellValue()); } break; case HSSFCell.CELL_TYPE_FORMULA: // 导入时如果为公式生成的数据则无值 if (!cell.getStringCellValue().equals("")) { value = cell.getStringCellValue(); } else { value = cell.getNumericCellValue() + ""; } break; case HSSFCell.CELL_TYPE_BLANK: break; case HSSFCell.CELL_TYPE_ERROR: value = ""; break; case HSSFCell.CELL_TYPE_BOOLEAN: value = (cell.getBooleanCellValue() == true ? "Y" : "N"); break; default: value = ""; } } if (columnIndex == 0 && value.trim().equals("")) { break; } values[columnIndex] = rightTrim(value); hasValue = true; } if (hasValue) { result.add(values); } } } in.close(); String[][] returnArray = new String[result.size()][rowSize]; for (int i = 0; i < returnArray.length; i++) { returnArray[i] = (String[]) result.get(i); } return returnArray; } /** * 去掉字符串右边的空格 * @param str 要处理的字符串 * @return 处理后的字符串 */ public static String rightTrim(String str) { if (str == null) { return ""; } int length = str.length(); for (int i = length - 1; i >= 0; i--) { if (str.charAt(i) != 0x20) { break; } length--; } return str.substring(0, length); } public static void main(String[] args) throws Exception { File file = new File("F:/tomcat7/webapps/Excel/upload/3.xls"); String[][] result = getData(file, 1); int rowLength = result.length; System.out.println("rowLength="+rowLength); for(int i=0;i<rowLength;i++) { for(int j=0;j<result[i].length;j++) { System.out.print(result[i][j]+"\t\t"); } System.out.println(); } String[][] body = result; String filePath = "F:/tomcat7/webapps/Excel/upload/68.xls"; JxlTable testJxl = JxlTable.getInstance(); boolean flag = testJxl.createTable(body, filePath,rowLength); if (flag) { System.out.println("表格创建成功!!"); } } }
PB中如何得到动态Crosstab中的某个单格列名和数据
PB中如何得到动态Crosstab中的某个单元格列名和数据,当选中某个单元格列名的数据时, 数据的color就会改变,其他的还是原来的color.
小白求助:poi生成excel速度过慢问题,该怎么优化
package poiMain; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.text.DateFormat; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.Scanner; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFDataFormat; import org.apache.poi.hssf.usermodel.HSSFDateUtil; import org.apache.poi.ss.usermodel.Font; import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFCellStyle; import org.apache.poi.xssf.usermodel.XSSFFont; import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class PoiGH3215 { private static String fileName=""; public static String getCell(int x,int y) throws IOException{ DecimalFormat df = new DecimalFormat("#"); InputStream myxls=new FileInputStream(fileName); @SuppressWarnings("resource") XSSFWorkbook wb =new XSSFWorkbook(myxls); XSSFSheet sheet=wb.getSheetAt(0);//第一个工作表 XSSFRow row =sheet.getRow(x-1);//第x行 XSSFCell cell =row.getCell((short)y-1);//第x行第y个元素 if(cell==null){ return null; } String cellValue = ""; switch (cell.getCellType()) { case HSSFCell.CELL_TYPE_STRING: cellValue = cell.getRichStringCellValue().getString().trim(); break; case HSSFCell.CELL_TYPE_NUMERIC: if (HSSFDateUtil.isCellDateFormatted(cell)) {// 处理日期格式、时间格式 SimpleDateFormat sdf = null; if (cell.getCellStyle().getDataFormat() == HSSFDataFormat .getBuiltinFormat("h:mm")) { sdf = new SimpleDateFormat("HH:mm"); } else {// 日期 sdf = new SimpleDateFormat("yyyy/MM/dd"); } Date date = cell.getDateCellValue(); cellValue = sdf.format(date); } else { cellValue = df.format(cell.getNumericCellValue()).toString(); } break; default: cellValue = ""; } return cellValue; } public static void ModelGH3215() throws IOException{ @SuppressWarnings("resource") XSSFWorkbook wb =new XSSFWorkbook(); Date d = new Date(); DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss"); String fileName = df.format(d); FileOutputStream fileOut = new FileOutputStream("D:/输出/工行3215/" + fileName + "_main" + ".xls"); XSSFSheet sheet=wb.createSheet(); Font font = wb.createFont(); XSSFCellStyle style = wb.createCellStyle(); //新建单元格样式 font.setFontName("宋体"); font.setFontHeightInPoints((short) 12);//设置字体大小 font.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);//粗体显示 style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//居中 style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直 style.setBorderBottom(HSSFCellStyle.BORDER_MEDIUM); //下边框 style.setFont(font); //设置单元格列宽 sheet.setColumnWidth(0, 100 * 100); sheet.setColumnWidth(1, 100 * 30); sheet.setColumnWidth(3, 100 * 30); sheet.setColumnWidth(4, 100 * 30); sheet.setColumnWidth(9, 100 * 130); sheet.setColumnWidth(20, 100 * 40); XSSFRow row =sheet.createRow((short)0); XSSFCell cell=row.createCell((short)0); row.setHeight((short) 700);//设置行高 cell.setCellValue("银行科目"); row.getCell((short)0).setCellStyle(style); row.createCell((short)1).setCellValue("币别"); row.getCell((short)1).setCellStyle(style); row.createCell((short)2).setCellValue("序列号"); row.getCell((short)2).setCellStyle(style); row.createCell((short)3).setCellValue("日期"); row.getCell((short)3).setCellStyle(style); row.createCell((short)4).setCellValue("业务日期"); row.getCell((short)4).setCellStyle(style); row.createCell((short)5).setCellValue("凭证字"); row.getCell((short)5).setCellStyle(style); row.createCell((short)6).setCellValue("凭证号"); row.getCell((short)6).setCellStyle(style); row.createCell((short)7).setCellValue("凭证年"); row.getCell((short)7).setCellStyle(style); row.createCell((short)8).setCellValue("凭证期间"); row.getCell((short)8).setCellStyle(style); row.createCell((short)9).setCellValue("摘要"); row.getCell((short)9).setCellStyle(style); row.createCell((short)10).setCellValue("对方科目"); row.getCell((short)10).setCellStyle(style); row.createCell((short)11).setCellValue("结算方式"); row.getCell((short)11).setCellStyle(style); row.createCell((short)12).setCellValue("结算号"); row.getCell((short)12).setCellStyle(style); row.createCell((short)13).setCellValue(""); row.getCell((short)13).setCellStyle(style); row.createCell((short)14).setCellValue(""); row.getCell((short)14).setCellStyle(style); row.createCell((short)15).setCellValue("汇率"); row.getCell((short)15).setCellStyle(style); row.createCell((short)16).setCellValue("附件数"); row.getCell((short)16).setCellStyle(style); row.createCell((short)17).setCellValue("汇率类型"); row.getCell((short)17).setCellStyle(style); row.createCell((short)18).setCellValue("备注"); row.getCell((short)18).setCellStyle(style); row.createCell((short)19).setCellValue("对应外币"); row.getCell((short)19).setCellStyle(style); row.createCell((short)20).setCellValue("对应外币金额"); row.getCell((short)20).setCellStyle(style); int j = 1;int sum=0;int a=0;int s=getNum(); ArrayList<String> date1 = new ArrayList(); ArrayList<Integer> value1 = new ArrayList(); ArrayList<String> date2 = new ArrayList(); ArrayList<Integer> value2 = new ArrayList(); for(int i=5;i<s+2;i++){ if(PoiGH3215.getCell(i,4).equals("转款")&&(PoiGH3215.getCell(i,8).equals("31001547840050012398"))){ System.out.println("get"); XSSFRow row2 =sheet.createRow((short)j++); row2.createCell((short)14).setCellValue(getCell(i,5)); row2.createCell((short)13).setCellValue(getCell(i,7)); row2.createCell((short)3).setCellValue(getCell(i,2));//日期 row2.createCell((short)4).setCellValue(getCell(i,2));//日期 row2.createCell((short)0).setCellValue("1021.01.10|工行广州白云路支行(8980)-备汇缴");//第一列 row2.createCell((short)9).setCellValue("收转款,建行怒江2398转入工行侨香");//摘要 }else if(PoiGH3215.getCell(i,4).equals("收付")&&(!PoiGH3215.getCell(i,5).equals(PoiGH3215.getCell(i,6)))){ XSSFRow row3 =sheet.createRow((short)j); row3.createCell((short)9).setCellValue("付移动手机充值款"); row3.createCell((short)13).setCellValue(getCell(i,7));//添加值 row3.createCell((short)14).setCellValue(getCell(i,5));//添加值 row3.createCell((short)3).setCellValue(getCell(j,2)); row3.createCell((short)4).setCellValue(getCell(j,2)); row3.createCell((short)0).setCellValue("1021.01.10|工行广州白云路支行(8980)-备汇缴"); row3.createCell((short)14).setCellValue(getCell(i,5)); row3.createCell((short)9).setCellValue("收还款退款");//摘要 } else if(PoiGH3215.getCell(i,4).equals("收付")&&(PoiGH3215.getCell(i,5).equals(PoiGH3215.getCell(i,6)))){ XSSFRow row3 =sheet.createRow((short)j); row3.createCell((short)9).setCellValue("付移动手机充值款"); row3.createCell((short)13).setCellValue(getCell(i,7)); row3.createCell((short)14).setCellValue(getCell(i,5));//添加值 row3.createCell((short)3).setCellValue(getCell(j,2)); row3.createCell((short)4).setCellValue(getCell(j,2)); row3.createCell((short)0).setCellValue("1021.01.10|工行广州白云路支行(8980)-备汇缴"); row3.createCell((short)14).setCellValue(getCell(i,5)); row3.createCell((short)9).setCellValue("收收付");//摘要 } else if(PoiGH3215.getCell(i,4).equals("拉卡拉代付款")&&(!PoiGH3215.getCell(i,9).equals("拉卡拉支付有限公司客户备付金"))&&(!PoiGH3215.getCell(i,9).equals("拉卡拉支付有限公司(客户备付金)"))&&(!PoiGH3215.getCell(i,9).equals("拉卡拉网络技术有限公司北京分公司的数(合计数)"))){ //System.out.println(i); date1.add(PoiGH3215.getCell(i,2)); value1.add(Integer.parseInt(PoiGH3215.getCell(i,5))); } } for(int c=0;c<date1.size();c++){ try { if(date1.get(c).equals(date1.get(c+1))){ a=value1.get(c); sum=a+sum; }else { a= value1.get(c); sum=a+sum; date2.add(date1.get(c)); value2.add(sum); sum=0; } } catch (Exception e) { a=value1.get(c); sum=a+sum; date2.add(date1.get(c)); value2.add(sum); } } for(int k=0;k<date2.size();k++){ XSSFRow row3 =sheet.createRow((short)j+k); row3.createCell((short)14).setCellValue(value2.get(k)); row3.createCell((short)9).setCellValue("付代付款"); row3.createCell((short)3).setCellValue(date2.get(k)); row3.createCell((short)4).setCellValue(date2.get(k)); row3.createCell((short)0).setCellValue("1021.01.10|工行广州白云路支行(8980)-备汇缴"); } for(int m=1;m<j+date2.size();m++){ XSSFRow row2 =sheet.getRow((short)m); row2.createCell((short)1).setCellValue("RMB|人民币"); row2.createCell((short)15).setCellValue("1"); row2.createCell((short)16).setCellValue("0"); row2.createCell((short)17).setCellValue("01|公司汇率"); row2.createCell((short)20).setCellValue("0"); } wb.write(fileOut); fileOut.close(); System.out.println("输入完毕"); } public static int getNum() throws IOException{ synchronized (fileName) { while("".equals(fileName)){ System.out.println("请输入您的文件路径:"); Scanner sc = new Scanner(System.in); fileName = sc.nextLine(); sc.close(); } } InputStream myxls=new FileInputStream(fileName); @SuppressWarnings("resource") XSSFWorkbook wb =new XSSFWorkbook(myxls); XSSFSheet sheet=wb.getSheetAt(0);//第一个工作表 return sheet.getLastRowNum(); } } 我要处理的表有6万多行,我这个处理一个200行的都要1分钟
String数组之间如何传值
package com.excel.action; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.List; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFDateUtil; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.poifs.filesystem.POIFSFileSystem; import jxl.Workbook; import jxl.format.Alignment; import jxl.format.Border; import jxl.format.BorderLineStyle; import jxl.format.Colour; import jxl.format.UnderlineStyle; import jxl.write.Label; import jxl.write.NumberFormats; import jxl.write.WritableCellFormat; import jxl.write.WritableFont; import jxl.write.WritableSheet; import jxl.write.WritableWorkbook; import jxl.write.WriteException; import jxl.write.biff.RowsExceededException; public class JxlTable { private final static JxlTable jxlTable = new JxlTable(); public static JxlTable getInstance() { return jxlTable; } public JxlTable() { } public boolean createTable(String[] body, String filePath) { boolean createFlag = true; WritableWorkbook book; try { // 根据路径生成excel文件 book = Workbook.createWorkbook(new File(filePath)); // 创建一个sheet名为"表格" WritableSheet sheet = book.createSheet("表格", 0); // 设置NO列宽度 sheet.setColumnView(1, 5); // 去掉整个sheet中的网格线 sheet.getSettings().setShowGridLines(false); Label tempLabel = null; // 表体输出 int bodyLen = body.length; // 循环写入表体内容 for (int j = 0; j < bodyLen; j++) { String[] bodyTempArr = body[j].split(","); for (int k = 0; k < bodyTempArr.length; k++) { WritableCellFormat tempCellFormat = null; tempCellFormat = getBodyCellStyle(); if (tempCellFormat != null) { if (k == 0 || k == (bodyTempArr.length - 1)) { tempCellFormat.setAlignment(Alignment.CENTRE); } } tempLabel = new Label(1 + k, 2 + j, bodyTempArr[k], tempCellFormat); sheet.addCell(tempLabel); } } book.write(); book.close(); } catch (IOException e) { createFlag = false; System.out.println("EXCEL创建失败!"); e.printStackTrace(); } catch (RowsExceededException e) { createFlag = false; System.out.println("EXCEL单元设置创建失败!"); e.printStackTrace(); } catch (WriteException e) { createFlag = false; System.out.println("EXCEL写入失败!"); e.printStackTrace(); } return createFlag; } public WritableCellFormat getHeaderCellStyle() { WritableFont font = new WritableFont(WritableFont.createFont("宋体"), 10, WritableFont.BOLD, false, UnderlineStyle.NO_UNDERLINE); WritableCellFormat headerFormat = new WritableCellFormat( NumberFormats.TEXT); try { // 添加字体设置 headerFormat.setFont(font); // 设置单元格背景色:表头为黄色 headerFormat.setBackground(Colour.YELLOW); // 设置表头表格边框样式 // 整个表格线为粗线、黑色 headerFormat.setBorder(Border.ALL, BorderLineStyle.THICK, Colour.BLACK); // 表头内容水平居中显示 headerFormat.setAlignment(Alignment.CENTRE); } catch (WriteException e) { System.out.println("表头单元格样式设置失败!"); } return headerFormat; } public WritableCellFormat getBodyCellStyle() { WritableFont font = new WritableFont(WritableFont.createFont("宋体"), 10, WritableFont.NO_BOLD, false, UnderlineStyle.NO_UNDERLINE); WritableCellFormat bodyFormat = new WritableCellFormat(font); try { // 设置单元格背景色:表体为白色 bodyFormat.setBackground(Colour.WHITE); // 设置表头表格边框样式 // 整个表格线为细线、黑色 bodyFormat .setBorder(Border.ALL, BorderLineStyle.THIN, Colour.BLACK); } catch (WriteException e) { System.out.println("表体单元格样式设置失败!"); } return bodyFormat; } /** * 读取Excel的内容,第一维数组存储的是一行中格列的值,二维数组存储的是多少个行 * @param file 读取数据的源Excel * @param ignoreRows 读取数据忽略的行数,比喻行头不需要读入 忽略的行数为1 * @return 读出的Excel中数据的内容 * @throws FileNotFoundException * @throws IOException */ public static String[][] getData(File file, int ignoreRows) throws FileNotFoundException, IOException { List<String[]> result = new ArrayList<String[]>(); int rowSize = 0; BufferedInputStream in = new BufferedInputStream(new FileInputStream( file)); // 打开HSSFWorkbook POIFSFileSystem fs = new POIFSFileSystem(in); HSSFWorkbook wb = new HSSFWorkbook(fs); HSSFCell cell = null; for (int sheetIndex = 0; sheetIndex < wb.getNumberOfSheets(); sheetIndex++) { HSSFSheet st = wb.getSheetAt(sheetIndex); // 第一行为标题,不取 for (int rowIndex = ignoreRows; rowIndex <= st.getLastRowNum(); rowIndex++) { HSSFRow row = st.getRow(rowIndex); if (row == null) { continue; } int tempRowSize = row.getLastCellNum() + 1; if (tempRowSize > rowSize) { rowSize = tempRowSize; } String[] values = new String[rowSize]; Arrays.fill(values, ""); boolean hasValue = false; for (short columnIndex = 0; columnIndex <= row.getLastCellNum(); columnIndex++) { String value = ""; cell = row.getCell(columnIndex); if (cell != null) { // 注意:一定要设成这个,否则可能会出现乱码 cell.setEncoding(HSSFCell.ENCODING_UTF_16); switch (cell.getCellType()) { case HSSFCell.CELL_TYPE_STRING: value = cell.getStringCellValue(); break; case HSSFCell.CELL_TYPE_NUMERIC: if (HSSFDateUtil.isCellDateFormatted(cell)) { Date date = cell.getDateCellValue(); if (date != null) { value = new SimpleDateFormat("yyyy-MM-dd") .format(date); } else { value = ""; } } else { value = new DecimalFormat("0").format(cell .getNumericCellValue()); } break; case HSSFCell.CELL_TYPE_FORMULA: // 导入时如果为公式生成的数据则无值 if (!cell.getStringCellValue().equals("")) { value = cell.getStringCellValue(); } else { value = cell.getNumericCellValue() + ""; } break; case HSSFCell.CELL_TYPE_BLANK: break; case HSSFCell.CELL_TYPE_ERROR: value = ""; break; case HSSFCell.CELL_TYPE_BOOLEAN: value = (cell.getBooleanCellValue() == true ? "Y" : "N"); break; default: value = ""; } } if (columnIndex == 0 && value.trim().equals("")) { break; } values[columnIndex] = rightTrim(value); hasValue = true; } if (hasValue) { result.add(values); } } } in.close(); String[][] returnArray = new String[result.size()][rowSize]; for (int i = 0; i < returnArray.length; i++) { returnArray[i] = (String[]) result.get(i); } return returnArray; } /** * 去掉字符串右边的空格 * @param str 要处理的字符串 * @return 处理后的字符串 */ public static String rightTrim(String str) { if (str == null) { return ""; } int length = str.length(); for (int i = length - 1; i >= 0; i--) { if (str.charAt(i) != 0x20) { break; } length--; } return str.substring(0, length); } public static void main(String[] args) throws Exception { File file = new File("F:/tomcat7/webapps/Excel/upload/3.xls"); String[][] result = getData(file, 1); int rowLength = result.length; for(int i=0;i<rowLength;i++) { for(int j=0;j<result[i].length;j++) { System.out.print(result[i][j]+"\t\t"); } System.out.println(); } String[][] body = result; //如何传值? String filePath = "F:/tomcat7/webapps/Excel/upload/3333.xls"; JxlTable testJxl = JxlTable.getInstance(); boolean flag = testJxl.createTable(body, filePath); /////在这里报错 如何传值 求助 if (flag) { System.out.println("表格创建成功!!"); } } }
JAVA怎么做点击按钮促发事件弹出浏览窗口选择excel文件读取,并显示到另外一个界面上,请给出主要代码
JAVA怎么做点击按钮促发事件弹出浏览窗口选择excel文件读取,并显示到另外一个界面上?package com.excel; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.List; import javax.swing.JTextArea; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFDateUtil; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.poifs.filesystem.POIFSFileSystem; /** * 解析Excel的类 */ public class ExcelOperate { private JTextArea area; private String fileName; /** * 构造方法传值 * * @param area * 显示Excel内容的位置 * @param fileName * Excel文件名 */ public ExcelOperate(JTextArea area, String fileName) { this.area = area; this.fileName = fileName; } /** * 解析Excel文件 */ public void parseExcel() { File file = new File(fileName); String[][] result = null; try { result = getData(file, 1); } catch (IOException e) { e.printStackTrace(); } int rowLength = result.length; for (int i = 0; i < rowLength; i++) { for (int j = 0; j < result[i].length; j++) { area.append(result[i][j] + "\t\t"); } area.append("\n"); } } /** * 读取Excel的内容,第一维数组存储的是一行中格列的值,二维数组存储的是多少个行 * * @param file * 读取数据的源Excel * @param ignoreRows * 读取数据忽略的行数,比喻行头不需要读入 忽略的行数为1 * @return 读出的Excel中数据的内容 * @throws FileNotFoundException * @throws IOException */ public static String[][] getData(File file, int ignoreRows) throws FileNotFoundException, IOException { List<String[]> result = new ArrayList<String[]>(); int rowSize = 0; BufferedInputStream in = new BufferedInputStream(new FileInputStream( file)); // 打开HSSFWorkbook POIFSFileSystem fs = new POIFSFileSystem(in); HSSFWorkbook wb = new HSSFWorkbook(fs); HSSFCell cell = null; for (int sheetIndex = 0; sheetIndex < wb.getNumberOfSheets(); sheetIndex++) { HSSFSheet st = wb.getSheetAt(sheetIndex); // 第一行为标题,不取 for (int rowIndex = ignoreRows; rowIndex <= st.getLastRowNum(); rowIndex++) { HSSFRow row = st.getRow(rowIndex); if (row == null) { continue; } int tempRowSize = row.getLastCellNum() + 1; if (tempRowSize > rowSize) { rowSize = tempRowSize; } String[] values = new String[rowSize]; Arrays.fill(values, ""); boolean hasValue = false; for (short columnIndex = 0; columnIndex <= row.getLastCellNum(); columnIndex++) { String value = ""; cell = row.getCell(columnIndex); if (cell != null) { switch (cell.getCellType()) { case HSSFCell.CELL_TYPE_STRING: value = cell.getStringCellValue(); break; case HSSFCell.CELL_TYPE_NUMERIC: if (HSSFDateUtil.isCellDateFormatted(cell)) { Date date = cell.getDateCellValue(); if (date != null) { value = new SimpleDateFormat("yyyy-MM-dd") .format(date); } else { value = ""; } } else { value = new DecimalFormat("0").format(cell .getNumericCellValue()); } break; case HSSFCell.CELL_TYPE_FORMULA: // 导入时如果为公式生成的数据则无值 if (!cell.getStringCellValue().equals("")) { value = cell.getStringCellValue(); } else { value = cell.getNumericCellValue() + ""; } break; case HSSFCell.CELL_TYPE_BLANK: break; case HSSFCell.CELL_TYPE_ERROR: value = ""; break; case HSSFCell.CELL_TYPE_BOOLEAN: value = (cell.getBooleanCellValue() == true ? "Y" : "N"); break; default: value = ""; } } if (columnIndex == 0 && value.trim().equals("")) { break; } values[columnIndex] = rightTrim(value); hasValue = true; } if (hasValue) { result.add(values); } } } in.close(); String[][] returnArray = new String[result.size()][rowSize]; for (int i = 0; i < returnArray.length; i++) { returnArray[i] = (String[]) result.get(i); } return returnArray; } /** * 去掉字符串右边的空格 * * @param str * 要处理的字符串 * @return 处理后的字符串 */ public static String rightTrim(String str) { if (str == null) { return ""; } int length = str.length(); for (int i = length - 1; i >= 0; i--) { if (str.charAt(i) != 0x20) { break; } length--; } return str.substring(0, length); } } ------------------------------------------------------------------------------------------ package com.excel; import java.awt.BorderLayout; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.UIManager; import javax.swing.filechooser.FileNameExtensionFilter; /** * 主界面,按钮响应事件,文本域输出Excel内容 */ public class OpenExcel extends JFrame implements ActionListener { private JButton button; private JScrollPane pane; private JTextArea area; public OpenExcel() { super("解析Excel"); button = new JButton("点我选择Excel文件"); button.addActionListener(this); area = new JTextArea(); pane = new JScrollPane(area); this.add(button, BorderLayout.NORTH); this.add(pane); this.setSize(300, 300); this.setLocationRelativeTo(null); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); } // 按钮事件 public void actionPerformed(ActionEvent e) { JFileChooser chooser = new JFileChooser();// 文件选择对话框 chooser.setAcceptAllFileFilterUsed(false);// 取消所有文件过滤项 chooser.setFileFilter(new FileNameExtensionFilter("Excel文件", "xls"));// 设置只过滤扩展名为.xls的Excel文件 int i = chooser.showOpenDialog(this);// 打开窗口 if (i == JFileChooser.APPROVE_OPTION) { this.setLocation(0, 0); this.setSize(Toolkit.getDefaultToolkit().getScreenSize()); new ExcelOperate(area, chooser.getSelectedFile().getAbsolutePath()) .parseExcel(); } } public static void main(String[] args) throws Exception { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); new OpenExcel(); } }我的代码是这样的,但是界面显示不出来,是什么问题?![图片](https://img-ask.csdn.net/upload/201706/09/1496974828_84401.jpg)
java如何进去选择框选择一个excel并将里面的数据显示到一个界面上
package com.excel; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.List; import javax.swing.JTextArea; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFDateUtil; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.poifs.filesystem.POIFSFileSystem; /** * 解析Excel的类 */ public class ExcelOperate { private JTextArea area; private String fileName; /** * 构造方法传值 * * @param area * 显示Excel内容的位置 * @param fileName * Excel文件名 */ public ExcelOperate(JTextArea area, String fileName) { this.area = area; this.fileName = fileName; } /** * 解析Excel文件 */ public void parseExcel() { File file = new File(fileName); String[][] result = null; try { result = getData(file, 1); } catch (IOException e) { e.printStackTrace(); } int rowLength = result.length; for (int i = 0; i < rowLength; i++) { for (int j = 0; j < result[i].length; j++) { area.append(result[i][j] + "\t\t"); } area.append("\n"); } } /** * 读取Excel的内容,第一维数组存储的是一行中格列的值,二维数组存储的是多少个行 * * @param file * 读取数据的源Excel * @param ignoreRows * 读取数据忽略的行数,比喻行头不需要读入 忽略的行数为1 * @return 读出的Excel中数据的内容 * @throws FileNotFoundException * @throws IOException */ public static String[][] getData(File file, int ignoreRows) throws FileNotFoundException, IOException { List<String[]> result = new ArrayList<String[]>(); int rowSize = 0; BufferedInputStream in = new BufferedInputStream(new FileInputStream( file)); // 打开HSSFWorkbook POIFSFileSystem fs = new POIFSFileSystem(in); HSSFWorkbook wb = new HSSFWorkbook(fs); HSSFCell cell = null; for (int sheetIndex = 0; sheetIndex < wb.getNumberOfSheets(); sheetIndex++) { HSSFSheet st = wb.getSheetAt(sheetIndex); // 第一行为标题,不取 for (int rowIndex = ignoreRows; rowIndex <= st.getLastRowNum(); rowIndex++) { HSSFRow row = st.getRow(rowIndex); if (row == null) { continue; } int tempRowSize = row.getLastCellNum() + 1; if (tempRowSize > rowSize) { rowSize = tempRowSize; } String[] values = new String[rowSize]; Arrays.fill(values, ""); boolean hasValue = false; for (short columnIndex = 0; columnIndex <= row.getLastCellNum(); columnIndex++) { String value = ""; cell = row.getCell(columnIndex); if (cell != null) { switch (cell.getCellType()) { case HSSFCell.CELL_TYPE_STRING: value = cell.getStringCellValue(); break; case HSSFCell.CELL_TYPE_NUMERIC: if (HSSFDateUtil.isCellDateFormatted(cell)) { Date date = cell.getDateCellValue(); if (date != null) { value = new SimpleDateFormat("yyyy-MM-dd") .format(date); } else { value = ""; } } else { value = new DecimalFormat("0").format(cell .getNumericCellValue()); } break; case HSSFCell.CELL_TYPE_FORMULA: // 导入时如果为公式生成的数据则无值 if (!cell.getStringCellValue().equals("")) { value = cell.getStringCellValue(); } else { value = cell.getNumericCellValue() + ""; } break; case HSSFCell.CELL_TYPE_BLANK: break; case HSSFCell.CELL_TYPE_ERROR: value = ""; break; case HSSFCell.CELL_TYPE_BOOLEAN: value = (cell.getBooleanCellValue() == true ? "Y" : "N"); break; default: value = ""; } } if (columnIndex == 0 && value.trim().equals("")) { break; } values[columnIndex] = rightTrim(value); hasValue = true; } if (hasValue) { result.add(values); } } } in.close(); String[][] returnArray = new String[result.size()][rowSize]; for (int i = 0; i < returnArray.length; i++) { returnArray[i] = (String[]) result.get(i); } return returnArray; } /** * 去掉字符串右边的空格 * * @param str * 要处理的字符串 * @return 处理后的字符串 */ public static String rightTrim(String str) { if (str == null) { return ""; } int length = str.length(); for (int i = length - 1; i >= 0; i--) { if (str.charAt(i) != 0x20) { break; } length--; } return str.substring(0, length); } } ------------------------------------------------------------------------------------------ package com.excel; import java.awt.BorderLayout; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.UIManager; import javax.swing.filechooser.FileNameExtensionFilter; /** * 主界面,按钮响应事件,文本域输出Excel内容 */ public class OpenExcel extends JFrame implements ActionListener { private JButton button; private JScrollPane pane; private JTextArea area; public OpenExcel() { super("解析Excel"); button = new JButton("点我选择Excel文件"); button.addActionListener(this); area = new JTextArea(); pane = new JScrollPane(area); this.add(button, BorderLayout.NORTH); this.add(pane); this.setSize(300, 300); this.setLocationRelativeTo(null); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); } // 按钮事件 public void actionPerformed(ActionEvent e) { JFileChooser chooser = new JFileChooser();// 文件选择对话框 chooser.setAcceptAllFileFilterUsed(false);// 取消所有文件过滤项 chooser.setFileFilter(new FileNameExtensionFilter("Excel文件", "xls"));// 设置只过滤扩展名为.xls的Excel文件 int i = chooser.showOpenDialog(this);// 打开窗口 if (i == JFileChooser.APPROVE_OPTION) { this.setLocation(0, 0); this.setSize(Toolkit.getDefaultToolkit().getScreenSize()); new ExcelOperate(area, chooser.getSelectedFile().getAbsolutePath()) .parseExcel(); } } public static void main(String[] args) throws Exception { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); new OpenExcel(); } }为什么实现不了?可以选择但是无法显示在界面上![图片](https://img-ask.csdn.net/upload/201706/08/1496885462_114736.jpg)
我根据网上的代码编写了点东西,为什么无法正确执行?
package com.excel; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.List; import javax.swing.JTextArea; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFDateUtil; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.poifs.filesystem.POIFSFileSystem; /** * 解析Excel的类 */ public class ExcelOperate { private JTextArea area; private String fileName; /** * 构造方法传值 * * @param area * 显示Excel内容的位置 * @param fileName * Excel文件名 */ public ExcelOperate(JTextArea area, String fileName) { this.area = area; this.fileName = fileName; } /** * 解析Excel文件 */ public void parseExcel() { File file = new File(fileName); String[][] result = null; try { result = getData(file, 1); } catch (IOException e) { e.printStackTrace(); } int rowLength = result.length; for (int i = 0; i < rowLength; i++) { for (int j = 0; j < result[i].length; j++) { area.append(result[i][j] + "\t\t"); } area.append("\n"); } } /** * 读取Excel的内容,第一维数组存储的是一行中格列的值,二维数组存储的是多少个行 * * @param file * 读取数据的源Excel * @param ignoreRows * 读取数据忽略的行数,比喻行头不需要读入 忽略的行数为1 * @return 读出的Excel中数据的内容 * @throws FileNotFoundException * @throws IOException */ public static String[][] getData(File file, int ignoreRows) throws FileNotFoundException, IOException { List<String[]> result = new ArrayList<String[]>(); int rowSize = 0; BufferedInputStream in = new BufferedInputStream(new FileInputStream( file)); // 打开HSSFWorkbook POIFSFileSystem fs = new POIFSFileSystem(in); HSSFWorkbook wb = new HSSFWorkbook(fs); HSSFCell cell = null; for (int sheetIndex = 0; sheetIndex < wb.getNumberOfSheets(); sheetIndex++) { HSSFSheet st = wb.getSheetAt(sheetIndex); // 第一行为标题,不取 for (int rowIndex = ignoreRows; rowIndex <= st.getLastRowNum(); rowIndex++) { HSSFRow row = st.getRow(rowIndex); if (row == null) { continue; } int tempRowSize = row.getLastCellNum() + 1; if (tempRowSize > rowSize) { rowSize = tempRowSize; } String[] values = new String[rowSize]; Arrays.fill(values, ""); boolean hasValue = false; for (short columnIndex = 0; columnIndex <= row.getLastCellNum(); columnIndex++) { String value = ""; cell = row.getCell(columnIndex); if (cell != null) { switch (cell.getCellType()) { case HSSFCell.CELL_TYPE_STRING: value = cell.getStringCellValue(); break; case HSSFCell.CELL_TYPE_NUMERIC: if (HSSFDateUtil.isCellDateFormatted(cell)) { Date date = cell.getDateCellValue(); if (date != null) { value = new SimpleDateFormat("yyyy-MM-dd") .format(date); } else { value = ""; } } else { value = new DecimalFormat("0").format(cell .getNumericCellValue()); } break; case HSSFCell.CELL_TYPE_FORMULA: // 导入时如果为公式生成的数据则无值 if (!cell.getStringCellValue().equals("")) { value = cell.getStringCellValue(); } else { value = cell.getNumericCellValue() + ""; } break; case HSSFCell.CELL_TYPE_BLANK: break; case HSSFCell.CELL_TYPE_ERROR: value = ""; break; case HSSFCell.CELL_TYPE_BOOLEAN: value = (cell.getBooleanCellValue() == true ? "Y" : "N"); break; default: value = ""; } } if (columnIndex == 0 && value.trim().equals("")) { break; } values[columnIndex] = rightTrim(value); hasValue = true; } if (hasValue) { result.add(values); } } } in.close(); String[][] returnArray = new String[result.size()][rowSize]; for (int i = 0; i < returnArray.length; i++) { returnArray[i] = (String[]) result.get(i); } return returnArray; } /** * 去掉字符串右边的空格 * * @param str * 要处理的字符串 * @return 处理后的字符串 */ public static String rightTrim(String str) { if (str == null) { return ""; } int length = str.length(); for (int i = length - 1; i >= 0; i--) { if (str.charAt(i) != 0x20) { break; } length--; } return str.substring(0, length); } } ------------------------------------------------------------------------------------------ package com.excel; import java.awt.BorderLayout; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.UIManager; import javax.swing.filechooser.FileNameExtensionFilter; /** * 主界面,按钮响应事件,文本域输出Excel内容 */ public class OpenExcel extends JFrame implements ActionListener { private JButton button; private JScrollPane pane; private JTextArea area; public OpenExcel() { super("解析Excel"); button = new JButton("点我选择Excel文件"); button.addActionListener(this); area = new JTextArea(); pane = new JScrollPane(area); this.add(button, BorderLayout.NORTH); this.add(pane); this.setSize(300, 300); this.setLocationRelativeTo(null); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); } // 按钮事件 public void actionPerformed(ActionEvent e) { JFileChooser chooser = new JFileChooser();// 文件选择对话框 chooser.setAcceptAllFileFilterUsed(false);// 取消所有文件过滤项 chooser.setFileFilter(new FileNameExtensionFilter("Excel文件", "xls"));// 设置只过滤扩展名为.xls的Excel文件 int i = chooser.showOpenDialog(this);// 打开窗口 if (i == JFileChooser.APPROVE_OPTION) { this.setLocation(0, 0); this.setSize(Toolkit.getDefaultToolkit().getScreenSize()); new ExcelOperate(area, chooser.getSelectedFile().getAbsolutePath()) .parseExcel(); } } public static void main(String[] args) throws Exception { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); new OpenExcel(); } }大神帮忙看一下,excel数据导入不进去怎么回事?![图片](https://img-ask.csdn.net/upload/201706/01/1496326764_634674.jpg)
相见恨晚的超实用网站
搞学习 知乎:www.zhihu.com 简答题:http://www.jiandati.com/ 网易公开课:https://open.163.com/ted/ 网易云课堂:https://study.163.com/ 中国大学MOOC:www.icourse163.org 网易云课堂:study.163.com 哔哩哔哩弹幕网:www.bilibili.com 我要自学网:www.51zxw
花了20分钟,给女朋友们写了一个web版群聊程序
参考博客 [1]https://www.byteslounge.com/tutorials/java-ee-html5-websocket-example
爬虫福利二 之 妹子图网MM批量下载
爬虫福利一:27报网MM批量下载    点击 看了本文,相信大家对爬虫一定会产生强烈的兴趣,激励自己去学习爬虫,在这里提前祝:大家学有所成! 目标网站:妹子图网 环境:Python3.x 相关第三方模块:requests、beautifulsoup4 Re:各位在测试时只需要将代码里的变量 path 指定为你当前系统要保存的路径,使用 python xxx.py 或IDE运行即可。
字节跳动视频编解码面经
引言 本文主要是记录一下面试字节跳动的经历。 三四月份投了字节跳动的实习(图形图像岗位),然后hr打电话过来问了一下会不会opengl,c++,shador,当时只会一点c++,其他两个都不会,也就直接被拒了。 七月初内推了字节跳动的提前批,因为内推没有具体的岗位,hr又打电话问要不要考虑一下图形图像岗,我说实习投过这个岗位不合适,不会opengl和shador,然后hr就说秋招更看重基础。我当时
开源一个功能完整的SpringBoot项目框架
福利来了,给大家带来一个福利。 最近想了解一下有关Spring Boot的开源项目,看了很多开源的框架,大多是一些demo或者是一个未成形的项目,基本功能都不完整,尤其是用户权限和菜单方面几乎没有完整的。 想到我之前做的框架,里面通用模块有:用户模块,权限模块,菜单模块,功能模块也齐全了,每一个功能都是完整的。 打算把这个框架分享出来,供大家使用和学习。 为什么用框架? 框架可以学习整体
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过
Python——画一棵漂亮的樱花树(不同种樱花+玫瑰+圣诞树喔)
最近翻到一篇知乎,上面有不少用Python(大多是turtle库)绘制的树图,感觉很漂亮,我整理了一下,挑了一些我觉得不错的代码分享给大家(这些我都测试过,确实可以生成喔~) one 樱花树 动态生成樱花 效果图(这个是动态的): 实现代码 import turtle as T import random import time # 画樱花的躯干(60,t) def Tree(branch
深深的码丨Java HashMap 透析
HashMap 相关概念 HashTab、HashMap、TreeMap 均以键值对像是存储或操作数据元素。HashTab继承自Dictionary,HashMap、TreeMap继承自AbstractMap,三者均实现Map接口 **HashTab:**同步哈希表,不支持null键或值,因为同步导致性能影响,很少被使用 **HashMap:**应用较多的非同步哈希表,支持null键或值,是键值对...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 顺便拉下票,我在参加csdn博客之星竞选,欢迎投票支持,每个QQ或者微信每天都可以投5票,扫二维码即可,http://m234140.nofollow.ax.
Python 基础(一):入门必备知识
目录1 标识符2 关键字3 引号4 编码5 输入输出6 缩进7 多行8 注释9 数据类型10 运算符10.1 常用运算符10.2 运算符优先级 1 标识符 标识符是编程时使用的名字,用于给变量、函数、语句块等命名,Python 中标识符由字母、数字、下划线组成,不能以数字开头,区分大小写。 以下划线开头的标识符有特殊含义,单下划线开头的标识符,如:_xxx ,表示不能直接访问的类属性,需通过类提供
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 欢迎 改进 留言。 演示地点跳到演示地点 html代码如下`&lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;title&gt;music&lt;/title&gt; &lt;meta charset="utf-8"&gt
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。 1. for - else 什么?不是 if 和 else 才
数据库优化 - SQL优化
前面一篇文章从实例的角度进行数据库优化,通过配置一些参数让数据库性能达到最优。但是一些“不好”的SQL也会导致数据库查询变慢,影响业务流程。本文从SQL角度进行数据库优化,提升SQL运行效率。 判断问题SQL 判断SQL是否有问题时可以通过两个表象进行判断: 系统级别表象 CPU消耗严重 IO等待严重 页面响应时间过长
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 c/c++ 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7
通俗易懂地给女朋友讲:线程池的内部原理
餐厅的约会 餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”我楞了一下,心里想女朋友今天是怎么了,怎么突然问出这么专业的问题,但做为一个专业人士在女朋友面前也不能露怯啊,想了一下便说:“我先给你讲讲我前同事老王的故事吧!” 大龄程序员老王 老王是一个已经北漂十多年的程序员,岁数大了,加班加不动了,升迁也无望,于是拿着手里
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹
面试官:你连RESTful都不知道我怎么敢要你?
面试官:了解RESTful吗? 我:听说过。 面试官:那什么是RESTful? 我:就是用起来很规范,挺好的 面试官:是RESTful挺好的,还是自我感觉挺好的 我:都挺好的。 面试官:… 把门关上。 我:… 要干嘛?先关上再说。 面试官:我说出去把门关上。 我:what ?,夺门而去 文章目录01 前言02 RESTful的来源03 RESTful6大原则1. C-S架构2. 无状态3.统一的接
JDK12 Collectors.teeing 你真的需要了解一下
前言 在 Java 12 里面有个非常好用但在官方 JEP 没有公布的功能,因为它只是 Collector 中的一个小改动,它的作用是 merge 两个 collector 的结果,这句话显得很抽象,老规矩,我们先来看个图(这真是一个不和谐的图????): 管道改造经常会用这个小东西,通常我们叫它「三通」,它的主要作用就是将 downstream1 和 downstre...
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
致 Python 初学者
欢迎来到“Python进阶”专栏!来到这里的每一位同学,应该大致上学习了很多 Python 的基础知识,正在努力成长的过程中。在此期间,一定遇到了很多的困惑,对未来的学习方向感到迷茫。我非常理解你们所面临的处境。我从2007年开始接触 python 这门编程语言,从2009年开始单一使用 python 应对所有的开发工作,直至今天。回顾自己的学习过程,也曾经遇到过无数的困难,也曾经迷茫过、困惑过。开办这个专栏,正是为了帮助像我当年一样困惑的 Python 初学者走出困境、快速成长。希望我的经验能真正帮到你
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU...
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1...
程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址
第一幕:缘起 听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员…… 996程序员做的梦: 第一场:团队招募 为了应对地府管理危机,阎王打算找“人”开发一套地府后台管理系统,于是就在地府总经办群中发了项目需求。 话说还是中国电信的信号好,地府都是满格,哈哈!!! 经常会有外行朋友问:看某网站做的不错,功能也简单,你帮忙做一下? 而这次,面对这样的需求,这个程序员...
网易云6亿用户音乐推荐算法
网易云音乐是音乐爱好者的集聚地,云音乐推荐系统致力于通过 AI 算法的落地,实现用户千人千面的个性化推荐,为用户带来不一样的听歌体验。 本次分享重点介绍 AI 算法在音乐推荐中的应用实践,以及在算法落地过程中遇到的挑战和解决方案。 将从如下两个部分展开: AI算法在音乐推荐中的应用 音乐场景下的 AI 思考 从 2013 年 4 月正式上线至今,网易云音乐平台持续提供着:乐屏社区、UGC...
8年经验面试官详解 Java 面试秘诀
作者 |胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位候选人。在本文里,就将结合本人的面试经验,针对Java初学者、Java初级开发和Java开发,给出若干准备简历和准备面试的建议。 Java程序员准备和投递简历的实...
面试官如何考察你的思维方式?
1.两种思维方式在求职面试中,经常会考察这种问题:北京有多少量特斯拉汽车?某胡同口的煎饼摊一年能卖出多少个煎饼?深圳有多少个产品经理?一辆公交车里能装下多少个乒乓球?一个正常成年人有多少根头发?这类估算问题,被称为费米问题,是以科学家费米命名的。为什么面试会问这种问题呢?这类问题能把两类人清楚地区分出来。一类是具有文科思维的人,擅长赞叹和模糊想象,它主要依靠的是人的第一反应和直觉,比如小孩...
碎片化的时代,如何学习
今天周末,和大家聊聊学习这件事情。 在如今这个社会,我们的时间被各类 APP 撕的粉碎。 刷知乎、刷微博、刷朋友圈; 看论坛、看博客、看公号; 等等形形色色的信息和知识获取方式一个都不错过。 貌似学了很多,但是却感觉没什么用。 要解决上面这些问题,首先要分清楚一点,什么是信息,什么是知识。 那什么是信息呢? 你一切听到的、看到的,都是信息,比如微博上的明星出轨、微信中的表情大战、抖音上的...
so easy! 10行代码写个"狗屁不通"文章生成器
前几天,GitHub 有个开源项目特别火,只要输入标题就可以生成一篇长长的文章。 背后实现代码一定很复杂吧,里面一定有很多高深莫测的机器学习等复杂算法 不过,当我看了源代码之后 这程序不到50行 尽管我有多年的Python经验,但我竟然一时也没有看懂 当然啦,原作者也说了,这个代码也是在无聊中诞生的,平时撸码是不写中文变量名的, 中文...
知乎高赞:中国有什么拿得出手的开源软件产品?(整理自本人原创回答)
知乎高赞:中国有什么拿得出手的开源软件产品? 在知乎上,有个问题问“中国有什么拿得出手的开源软件产品(在 GitHub 等社区受欢迎度较好的)?” 事实上,还不少呢~ 本人于2019.7.6进行了较为全面的回答,对这些受欢迎的 Github 开源项目分类整理如下: 分布式计算、云平台相关工具类 1.SkyWalking,作者吴晟、刘浩杨 等等 仓库地址: apache/skywalking 更...
MySQL数据库总结
一、数据库简介 数据库(Database,DB)是按照数据结构来组织,存储和管理数据的仓库。 典型特征:数据的结构化、数据间的共享、减少数据的冗余度,数据的独立性。 关系型数据库:使用关系模型把数据组织到数据表(table)中。现实世界可以用数据来描述。 主流的关系型数据库产品:Oracle(Oracle)、DB2(IBM)、SQL Server(MS)、MySQL(Oracle)。 数据表:数...
20行Python代码爬取王者荣耀全英雄皮肤
引言 王者荣耀大家都玩过吧,没玩过的也应该听说过,作为时下最火的手机MOBA游戏,咳咳,好像跑题了。我们今天的重点是爬取王者荣耀所有英雄的所有皮肤,而且仅仅使用20行Python代码即可完成。 准备工作 爬取皮肤本身并不难,难点在于分析,我们首先得得到皮肤图片的url地址,话不多说,我们马上来到王者荣耀的官网: 我们点击英雄资料,然后随意地选择一位英雄,接着F12打开调试台,找到英雄原皮肤的图片...
走进高并发(二)Java并行程序基础
一、进程和线程 在操作系统这门课程中,对进程的定义是这样的: 进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进行是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。 上面的定义很完整,对进程进行了全方面的定义,但是貌似进程是看不见摸不着的一个东西,实际上,我们可以通过查看计算...
张小龙-年薪近3亿的微信之父,他是如何做到的?
张小龙生于湖南邵东魏家桥镇, 家庭主要特点:穷。 不仅自己穷,亲戚也都很穷,可以说穷以类聚。爷爷做过铜匠,总的来说,标准的劳动阶级出身。 家有兄弟两人, 一个小龙,一个小虎。 小虎好动,与邻里打成一片, 小龙好静,喜好读书。 “文静的像个妹子。”张小龙的表哥如是说。 穷文富武,做个读书郎是个不错的选择。 87年至94年, 华中科技大学本硕连读。 本科就读电信系, 不喜欢上课...
阿里靠什么武功秘籍渡过“双十一“的天量冲击
双十一大概会产生多大的数据量呢,可能大家没概念,举个例子央视拍了这么多年电视新闻节目,几十年下来他存了大概80P的数据。而今年双11一天,阿里要处理970P的数据,做为一个IT人,笔者认为今年”双十一“阿里最大的技术看点有有以下两个: 阿里的数据库,也就是刚刚拿下TPC冠军的OcceanBase,处理峰值也达到了骇人听闻的6100万次/秒, 阿里核心系统百分百上云了。 如果把信息系统比做一个武...
西游记团队中如果需要裁掉一个人,会先裁掉谁?
2019年互联网寒冬,大批企业开始裁员,下图是网上流传的一张截图: 裁员不可避免,那如何才能做到不管大环境如何变化,自身不受影响呢? 我们先来看一个有意思的故事,如果西游记取经团队需要裁员一名,会裁掉谁呢,为什么? 西游记团队组成: 1.唐僧 作为团队teamleader,有很坚韧的品性和极高的原则性,不达目的不罢休,遇到任何问题,都没有退缩过,又很得上司支持和赏识(直接得到唐太宗的任命,既给袈...
相关热词 如何提升c#开发能力 矩阵乘法c# c#调用谷歌浏览器 c# 去空格去转义符 c#用户登录窗体代码 c# 流 c# linux 可视化 c# mvc 返回图片 c# 像素空间 c# 日期 最后一天
立即提问